2016-04-29 56 views
1

我想测试行为春季rabbitmq确认回调,根据api描述如果任何否定确认通过消费者发送,确认回调应该给出确认的虚假值,但在我的情况下总是给出真实的。即使我将消息发布到已删除的队列,我在确认回调中获得了真正的价值。请让我知道如何得到否定的承认。春季RabbitMQ确认回调没有按预期工作

下面是我如何创建RabbitTemplate bean的代码。

@Bean 
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { 
     RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); 
     ((CachingConnectionFactory)rabbitTemplate.getConnectionFactory()).setPublisherConfirms(true); 
     rabbitTemplate.setConfirmCallback(new ConfirmCallback() { 

      @Override 
      public void confirm(CorrelationData corData, boolean ack, String cause) { 
       System.out.println("devconfig.rabbitTemplate(...).new ConfirmCallback() {...}.confirm()"+corData); 
       System.out.println("devconfig.rabbitTemplate(...).new ConfirmCallback() {...}.confirm()"+ack); 
      } 
     }); 
     return rabbitTemplate; 

    } 

回答

0

这不是ACK的工作方式 - ACK意味着它被送到交换 - 这是难得获得NACK - 根据RabbitMQ documentation你只会得到一个nack如果有在代理本身出现了问题。 ..

否定确认 在特殊情况下,当经纪人是无法成功地处理,而不是basic.ack的消息,经纪人将发送basic.nack。在这种情况下,basic.nack的字段与basic.ack中的对应字段具有相同的含义,并且应忽略重复字段。通过隐藏一条或多条消息,经纪人表示无法处理消息并拒绝对他们负责;那时,客户可以选择重新发布消息。

通道进入确认模式后,所有随后发布的消息将被确认或删除一次。无法保证消息的确认时间。没有消息将被确认和nack'd。

basic.nack只会在负责队列的Erlang进程发生内部错误时才会被传递。

除此之外,如果在收到确认之前连接已关闭(再次 - 非常罕见),Spring AMQP将生成一个Nack。

如果您想要获得关于无法将邮件传递给队列的通知,则必须启用发布者返回并将mandatory设置为true,并且邮件将返回给您。