波斯马BOSSMA Information Technology

否定应答(NACK)

发布时间:2017年10月30日 / 分类:RabbitMQ / 5,186 次浏览 / 评论

这篇文章翻译自: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),消息将被重新加入队列中靠近队列头的位置。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《否定应答(NACK)

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论