跳到主要内容
版本: 4.1

否定应答

概述

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);
© . All rights reserved.