负确认
概述
在 AMQP 0-9-1 中,消费者可以选择使用手动确认传递。
The AMQP 0-9-1 规范 定义了 basic.reject
方法,允许客户端拒绝单个传递的消息,指示代理丢弃或重新排队这些消息。不幸的是,basic.reject
不支持对消息进行批量负确认。
为了解决这个问题,RabbitMQ 支持 basic.nack
方法,该方法提供了 basic.reject
的所有功能,同时还允许对消息进行批量处理。
用法
要批量拒绝消息,客户端将 basic.nack
方法的 multiple
标志设置为 true
。然后,代理将拒绝所有未确认的传递的消息,直到且包括 basic.nack
方法的 delivery_tag
字段中指定的消息。在这方面,basic.nack
补充了 basic.ack
的批量确认语义。
负确认适用于长时间运行的消费者和基于轮询的消费者(使用 basic.get
)。
当消息被重新排队时,它将尽可能被放置到其队列中的原始位置。如果无法实现(由于并发传递和来自其他消费者的确认,当多个消费者共享一个队列时),则消息将被重新排队到更靠近队列头部的某个位置。
示例
Java
此 Java 客户端示例拒绝通过轮询(basic.get
)消费的单个消息,要求代理将其重新排队
GetResponse gr = channel.basicGet("some.queue", false);
channel.basicNack(gr.getEnvelope().getDeliveryTag(), false, true);
此示例使用对代理的单个调用拒绝两条消息(basicNack
上的第二个参数是 multiple
标志)
GetResponse gr1 = channel.basicGet("some.queue", false);
GetResponse gr2 = channel.basicGet("some.queue", false);
channel.basicNack(gr2.getEnvelope().getDeliveryTag(), true, true);