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