我正在尝试测试行为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;
}
答案 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,并且该消息将返回给您。