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

Spring RabbitMQ确认回调未按预期工作,rabbitmq,spring-amqp,Rabbitmq,Spring Amqp,我正在尝试测试spring rabbitmq确认回调的行为,根据api描述,如果任何否定的确认是通过消费者发送的,则确认回调应该给出ack的假值,但在我的情况下总是给出true。即使我将消息发布到已删除队列,我在确认回调中也得到了真实值。请让我知道如何得到否定的承认 下面是我如何创建RabbitTemplatebean的代码 @Bean public RabbitTemplate rabbitTemplate( ConnectionFactory connectionFactory )

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

下面是我如何创建RabbitTemplatebean的代码

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

    }

这不是ack的工作方式-ack意味着它被交付给了交易所-获得nack是很少见的-根据协议,如果代理本身有问题,你只能获得
nack

否定承认

在异常情况下,当代理无法成功处理消息时,代理将发送
basic.ack
,而不是
basic.nack
。在此上下文中,
basic.nack
中的字段与
basic.ack
中的相应字段具有相同的含义,应忽略requeue字段。通过对一条或多条消息进行nack,代理表示它无法处理这些消息,并拒绝对它们负责;此时,客户端可以选择重新发布消息

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

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

除此之外,如果在接收到ack之前连接关闭,Spring AMQP会生成Nack(同样,非常罕见)

如果您希望获得无法将消息传递到队列的通知,则必须启用publisher returns并将
mandatory
设置为true,消息将返回给您