RabbitMQを使用して2つのアプリケーションがデータを交換しています。私はこれをSpring AMQPを使って実装しました。処理中に例外が発生する可能性があります。キューからのメッセージを自動的に削除するSpring AMQPを使用して一度消費する
例外が発生した場合は、データベースにログインする予定です。メッセージが正常に処理されたか、エラーが発生したかどうかにかかわらず、メッセージが消費者に到達すると、キューからメッセージを明示的に削除する必要があります。
メッセージを強制的にキューから削除するには、それ以外の場合は、アプリケーションで処理できない場合は になります。
以下は私のリスナーコード
@RabbitListener(containerFactory="rabbitListenerContainerFactory",queues=Constants.JOB_QUEUE)
public void handleMessage(JobListenerDTO jobListenerDTO) {
//System.out.println("Received summary: " + jobListenerDTO.getProcessXML());
//amqpAdmin.purgeQueue(Constants.JOB_QUEUE, true);
try{
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("initiator", "cmy5kor");
Deployment deploy = repositoryService.createDeployment().addString(jobListenerDTO.getProcessId()+".bpmn20.xml",jobListenerDTO.getProcessXML()).deploy();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(jobListenerDTO.getProcessId(), variables);
System.out.println("Process Instance is:::::::::::::"+processInstance);
}catch(Exception e){
e.printStackTrace();
}
構成コード限り、あなたのリスナーは、メッセージがキューから削除されます例外をキャッチするよう
@Configuration
@EnableRabbit
public class RabbitMQJobConfiguration extends AbstractBipRabbitConfiguration {
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
template.setQueue(Constants.JOB_QUEUE);
template.setMessageConverter(jsonMessageConverter());
return template;
}
@Bean
public Queue jobQueue() {
return new Queue(Constants.JOB_QUEUE);
}
@Bean(name="rabbitListenerContainerFactory")
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
DefaultClassMapper classMapper = new DefaultClassMapper();
Map<String, Class<?>> idClassMapping = new HashMap<String, Class<?>>();
idClassMapping.put("com.bosch.diff.approach.TaskMessage", JobListenerDTO.class);
classMapper.setIdClassMapping(idClassMapping);
messageConverter.setClassMapper(classMapper);
factory.setMessageConverter(messageConverter);
factory.setReceiveTimeout(10L);
return factory;
}
}
ありがとうございました。 **私はgithubでいくつかの例を読んで実装することができますか?** – Chandan
[samples](http://docs.spring.io/spring-amqp//reference/html/_reference.html#sample -apps)。 –
@GaryRussell、私が知っているからrabbitmqはACKを受け取った後に**キューからメッセージを削除しますか?だから、spring-bootがACKを送るとき?任意の場合( 'AmqpRejectAndDontRequeueException'を除いて)、リスナーからキャッチされない例外がありますか?わかりました。しかし、自分のコンバータ(例えば、パーサの例外)からuncauht例外が発生した場合はどうしますか? –