[聚合文章] 否定应答(NACK)

消息系统 2017-10-30 15 阅读

这篇文章翻译自: http://www.rabbitmq.com/nack.html

消费者在AMQP 0-9-1中可以选择对投递使用手动ACK。

AMQP 0-9-1规范定义了 basic.reject方法,使客户端可以拒绝单个已投递的消息,以及指示代理移除他们或者重新入队列。不幸的是,basic.reject没有提供对大批量消息否定应答的支持。

为了解决这个问题,RabbitMQ支持 basic.nack方法,除了提供basic.reject的所有功能,还支持大批量消息的处理。

为了以批量方式拒绝消息,客户端设置basic.nack方法的多个标识为true。然后代理将拒绝所有未确认已投递的消息,直至并包括 basic.nack方法中delivery_tag字段指定的消息。在这个方面,basic.nack完成了basic.ack的批量ACK语义。

这个例子拒绝单个消息,并请求代理将它重新入队列:

GetResponse gr = channel.basicGet("some.queue", false);
channel.basicNack(gr.getEnvelope().getDeliveryTag(), false, true);

这个例子调用代理一次同时拒绝两条消息(basicNack的第二个参数表示多条的意思):

GetResponse gr1 = channel.basicGet("some.queue", false);
GetResponse gr2 = channel.basicGet("some.queue", false);
channel.basicNack(gr2.getEnvelope().getDeliveryTag(), true, true);

当消息重新入队,如果可能,它将被放在队列的原始位置。如果不行(当多个消费者共享同一队列时,由于并发投递和来自其它消费者的ACK),消息将被重新加入队列中靠近队列头的位置。

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。