2017-03-15 9 views
0

のために呼ばれて、なぜ私は、単純なPublisher->交換 - >キューとリスナーモデルのConfirmCallbackReturnCallbackフローをテストしています。私はpublisherConfirms、publisherReturnsを必須に設定しました。 無効なキュー名を使用して、既存の交換機に新しいメッセージを発行しました。期待どおり、私はReturnCallback.returnedMessageメソッドのコールバックを受け取りました。しかし、私はConfirmCallback.confirmメソッドへのコールバックも受け取りました。キュー名が無効なので、ReturnCallback.returnedMessageメソッドだけがコールバックを受け取っているはずです。 ConfirmCallback.confirmメソッドが呼び出されるのはなぜですか?私は何度もシナリオをテストして、同じ結果を受けました。以下のコードスニペットとログファイルをご確認のうえ、何か問題がある場合にお知らせください。ブローカーがそれを処理終了時は、無効なキューに公開する場合は、ReturnCallbackが呼び出されますが、ConfirmCallbackが同じメッセージ

rabbitTemplate.setMandatory(true); 
      rabbitTemplate.setConfirmCallback(new ConfirmCallback() { 

       @Override 
       public void confirm(final CorrelationData correlationData, final boolean ack, 
         final String cause) { 
        System.out.println("confirmCallback received with correlationData, ack, cause" + correlationData+ cause + ack); 
        if (null != confirmCallbackUser) { 
          confirmCallbackUser.confirm(correlationData.getId(), ack, cause); 
        } }); 


      rabbitTemplate.setMandatory(true); 
      rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() 
       @Override 
       public void returnedMessage(final Message message, final int replyCode, 
         final String replyText, final String exchange, final String routingKey) { 
        Message msg = new Message(message); 
        try { 
         System.out.println("returnCallBackUser received with message, replyCode, replyText, exchange, routingKey" + message + replyCode + replyText+ exchange + routingKey); 
         returnCallBackUser.returnedMessage(msg, replyCode, replyText, exchange, 
           routingKey); 
        } catch (MessagingException e) { 
         System.out.println("returnCallBackUser exception : " + e.getMessage()); 
    e.printStackTrace(); 
        } 
        System.err.println(" Message Returned"); 

       } 

ログ

40053 [https-openssl-nio-8443-exec-6] DEBUG c.s.n.f.s.messaging.MessImpl **- Control reached send()** 
40056 [https-openssl-nio-8443-exec-6] DEBUG o.s.a.r.c.CachingConnectionFactory - Creating cached Rabbit Channel from PublisherCallbackChannelImpl: AMQChannel(amqp://[email protected]:5672/,2) 
40056 [https-openssl-nio-8443-exec-6] DEBUG o.s.a.r.s.PublisherCallbackChannelImpl - Added listener [email protected] 
40057 [https-openssl-nio-8443-exec-6] DEBUG o.s.amqp.rabbit.core.RabbitTemplate - Added pubsub channel: Cached Rabbit Channel: PublisherCallbackChannelImpl: AMQChannel(amqp://[email protected]:5672/,2), conn: [email protected] Shared Rabbit Connection: [email protected] [delegate=amqp://[email protected]:5672/, localPort= 60962] to map, size now 1 
40057 [https-openssl-nio-8443-exec-6] DEBUG o.s.amqp.rabbit.core.RabbitTemplate **- Executing callback on RabbitMQ Channel: Cached Rabbit Channel:** PublisherCallbackChannelImpl: AMQChannel(amqp://[email protected]:5672/,2), conn: [email protected] Shared Rabbit Connection: [email protected] [delegate=amqp://[email protected]:5672/, localPort= 60962] 
40061 [https-openssl-nio-8443-exec-6] DEBUG o.s.amqp.rabbit.core.RabbitTemplate **- Publishing message on exchange [ControlExchange], routingKey = [invalidQueue]** 
40064 [https-openssl-nio-8443-exec-6] DEBUG c.s.n.f.s.messaging.MessImpl - **Control moving out of send()** 
***returnCallBackUser received with message,*** replyCode, replyText, exchange, routingKey(Body:'[[email protected](byte[91])' MessageProperties [headers={IDENTITY=TOMCAT_CONTROL}, timestamp=null, messageId=null, userId=null, receivedUserId=null, appId=null, clusterId=null, type=null, correlationId=[80, 114, 111, 100, 117, 99, 101, 114], correlationIdString=null, replyTo=ControlExchange/ComAckQueue, contentType=application/octet-stream, contentEncoding=null, contentLength=0, deliveryMode=null, receivedDeliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=null, receivedExchange=null, receivedRoutingKey=null, receivedDelay=null, deliveryTag=0, messageCount=null, consumerTag=null, consumerQueue=null])312NO_ROUTEControlExchangeinvalidQueue 
40066 [AMQP Connection 127.0.0.1:5672] INFO c.s.n.f.s.m.CallBackRecReplyInterfaceTemplate - Message {"Test":"abcd","Role":"abcd","Id":"1111","request":"Accepted","De":"invalidQueue"} replyCode-> 312breplyText-> NO_ROUTE exchange-> Exchange routingKey-> invalidQueue 
**Message Returned** 
40066 [AMQP Connection 127.0.0.1:5672] DEBUG o.s.a.r.s.PublisherCallbackChannelImpl - **PublisherCallbackChannelImpl: AMQChannel(amqp://[email protected]:5672/,2) PC:Ack:1:false** 
40067 [AMQP Connection 127.0.0.1:5672] DEBUG o.s.a.r.s.PublisherCallbackChannelImpl - **Sending confirm PendingConfirm [correlationData=CorrelationData [id=corrlDat]] 
confirmCallback received with correlationData, ack, causeCorrelationData [id=corrlDat]nulltrue** 
40067 [AMQP Connection 127.0.0.1:5672] INFO c.s.n.f.s.m.CallbackConfirmImplTempl - **ACK->truecause->nullcorr id corrlDat 
40067 [AMQP Connection 127.0.0.1:5672] INFO c.s.n.f.s.messaging.MessagingImpl - ACK->truecause->nullcorr id corrlDat** 

答えて

1

パブリッシャが呼び出しを確認します。キューが間違っている場合、ブローカはメッセージがルーティングされないことを確認するときに確認を送信します。 「いつメッセージを確認するか」のセクションのdocumentationを参照してください。

関連する問題