当前访客身份:游客 [ 登录  | 注册加入尚学堂]
直播

我来了!

拥有积分:4024
尚学堂雄起!!威武。。。

博客分类

笔记中心

课题中心

提问中心

答题中心

解答题中心

【原创】RabbitMQ 之 Negative Acknowledgements(翻译)

我来了! 发表于 2年前 (2014-11-07 16:17:32)  |  评论(0)  |  阅读次数(409)| 0 人收藏此文章,   我要收藏   

Negative Acknowledgements

The AMQP specification defines the basic.reject method that allows clients to reject individual, delivered messages, instructing the broker to either discard them or requeue them. Unfortunately, basic.reject provides no support for negatively acknowledging messages in bulk.
AMQP 标准定义了 basic.reject 方法以允许 client 拒绝单条的、被 deliver 的 message ,拒绝的同时还可以要求 broker 或者丢弃该 message ,或者将 message 做 requeue 。不幸的是,basic.reject 不支持一次对多条 message 进行 reject 。

To solve this, RabbitMQ supports the basic.nack method that provides all the functionality of basic.reject whilst also allowing for bulk processing of messages.
为了解决这个问题,RabbitMQ 实现了扩展方法 basic.nack 来提供一次对多条 message 进行 reject 的功能。

To reject messages in bulk, clients set the multiple flag of the basic.nack method to true. The broker will then reject all unacknowledged, delivered messages up to and including the message specified in the delivery_tag field of the basic.nack method. In this respect, basic.nack complements the bulk acknowledgement semantics of basic.ack.
为了使能一次 reject 多条 message 的功能,client 需要将 basic.nack 中的 multiple 属性设置为 true 。收到 basic.nack 后,broker 会知道,包含 delivery_tag 所对应 message 在内的、所有比该值小的 message 都被拒绝了(除了已经被 ack 的以外)。从这个角度来讲,basic.nack 与 basic.ack 在批量应答 message 的功能上互补。

This example rejects a single message, asking the broker to requeue it:
下面是一个 reject 单条消息,并要求 broker 将其 requeue 的例子:

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

This example rejects two messages with a single call to the broker (the second argument on 
basicNack  is the  multiple  flag):
下面是使用 AMQP 扩展信令中一次性 reject 两条 message 的例子(basicNack 的第二个参数为 multiple 标识 ):
GetResponse gr1 = channel.basicGet("some.queue", false);
GetResponse gr2 = channel.basicGet("some.queue", false);
channel.basicNack(gr2.getEnvelope().getDeliveryTag(), true, true);







分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183