2016-08-27 7 views
0

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; 
    } 



} 

答えて

0

です。

リスナーが例外をスローすると、デフォルトで再キューされます。その動作はAmqpRejectAndDontRequeueExceptionをスローするか、またはdefaultRequeueRejectedプロパティを設定することによって変更できます。the documentation for detailsを参照してください。

+0

ありがとうございました。 **私はgithubでいくつかの例を読んで実装することができますか?** – Chandan

+0

[samples](http://docs.spring.io/spring-amqp//reference/html/_reference.html#sample -apps)。 –

+0

@GaryRussell、私が知っているからrabbitmqはACKを受け取った後に**キューからメッセージを削除しますか?だから、spring-bootがACKを送るとき?任意の場合( 'AmqpRejectAndDontRequeueException'を除いて)、リスナーからキャッチされない例外がありますか?わかりました。しかし、自分のコンバータ(例えば、パーサの例外)からuncauht例外が発生した場合はどうしますか? –

1

私は、メッセージが、成功した処理やエラー発生したかどうかを消費者に到達すると、明示的にキューからメッセージを削除する必要がRMQのための春のAPIや設定について知っているが、これ

ません。

は、自動確認フラグを設定したときに起こっていることとまったく同じです。このようにして、メッセージは消費されるとすぐに確認されます。キューから消えてしまいます。

関連する問題