Spring RabbitMQ确认回调未按预期工作

时间:2016-04-29 12:04:54

标签: rabbitmq spring-amqp

我正在尝试测试行为spring rabbitmq确认回调,根据api描述,如果通过消费者发送任何否定确认,确认回调应该给出ack的假值但在我的情况下总是给出真值。即使我将消息发布到已删除的队列,我在确认回调中获得了真正的价值。请让我知道如何得到否定的确认。

下面是我创建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;

    }

1 个答案:

答案 0 :(得分:0)

这不是ack的工作方式 - 确认它是交付给交易所的 - 很少得到一个nack - 根据RabbitMQ documentation你只会获得nack如果经纪人本身存在问题......

  

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

     

将频道置于确认模式后,所有随后发布的消息将被确认或一次性确认。不保证消息的确定时间。没有任何消息都会得到确认和nack' d。

     只有在负责队列的Erlang进程中发生内部错误时,才会传递

basic.nack

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

如果您希望收到有关无法将消息发送到队列的通知,您必须启用发布者返回并将mandatory设置为true,并且该消息将返回给您。