跳至主要内容
版本: 4.0

负确认

概述

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