负面确认
概述
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);