文档章节

RabbitMQ消息确认与消息重新入队

你我他有个梦
 你我他有个梦
发布于 2016/07/15 08:46
字数 568
阅读 8086
收藏 88

消息确认

当生产者投递消息到消费者broker会立即从内存中将消息删除,在这种情况下,杀掉一个消费者将会丢失消息。

为了确认消息不会丢失,rabbitmq支持message acknowledgments。一个ACK的响应会从消费端返回,告诉rabbitmq一个特定的消息已被接收。

当rabbitmq空闲时会处理它,将它删除。

如果一个消费者挂掉(channel被关闭、connection被关闭或者TCP 连接被关闭)而没有发送ACK,那么rabbitmq会让这个消息重新入队。

如果在同一时间内有其他的消费者连接了,他快被快速的投递到其他的消费者那。即使工作者偶尔挂掉,这种方式下也可以确定没有消息会丢失。

没有任何的消息超时,当消费者挂掉,rabbitmq将重新投递这些消息。对于处理一个消息需要非常非常长的时间也没关系因为不会超时。

消息的ack默认是打开的,默认标记是autoAck=true,当完成了任务得到了ack响应那么可以删除掉这个标记,也就是autoAck=false。

示例代码在官网有详细的说明:http://www.rabbitmq.com/getstarted.html,第二个选项 Work queues页中有Message acknowledgment,选择自己对应的语言即可。

消息重新入队

basicRecover:是路由不成功的消息可以使用recovery重新发送到队列中。


basicReject:是接收端告诉服务器这个消息我拒绝接收,不处理,可以设置是否放回到队列中还是丢掉,而且只能一次拒绝一个消息,官网中有明确说明不能批量拒绝消息,为解决批量拒绝消息才有了basicNack。

basicNack:可以一次拒绝N条消息,客户端可以设置basicNack方法的multiple参数为true,服务器会拒绝指定了delivery_tag的所有未确认的消息(tag是一个64位的long值,最大值是9223372036854775807)。

示例代码:

官网中有明确的代码示例:http://www.rabbitmq.com/nack.html

API结合具体的业务应用。

© 著作权归作者所有

共有 人打赏支持
你我他有个梦

你我他有个梦

粉丝 96
博文 110
码字总数 98858
作品 0
昌平
程序员
加载中

评论(16)

陈亦
陈亦

引用来自“xuanskyer”的评论

rabbitmq的持久化熟悉么,我试了下开启持久化,消费者断开重新连的化,之前的消息并没有接收到
持久化包括:exchange, queue, message。三者都要持久化。
J
JM衣领
你好! 请教一个关于消息重新入队的问题,新版本消费重新入队机制是放在原始位置并立马推送至其他消费端,以前的老版本是放在队列的最后。
新版中 如果当前一个消费者,消费端处理异常将当前消息重新入队,然而这个消息会一直不断的推送给自己 ,请问是否有机制处理的? 期待您的解答,先谢谢了。
你我他有个梦
你我他有个梦
代码建议参考官网的,官网中都有基础示例代码
逝去的回忆
逝去的回忆

引用来自“笔记本”的评论

http://blog.csdn.net/movie0125 我的博客中有python代码示例,大家可以看看
你写的那是些啥啊,一个基础写出来还不如不写,真是的。。。
笔记本
http://blog.csdn.net/movie0125 我的博客中有python代码示例,大家可以看看
小九酒
小九酒
nice
superchris
superchris
真的是太草率了。。。
心尖偏左
心尖偏左
有代码示例就更好了
你我他有个梦
你我他有个梦

引用来自“xuanskyer”的评论

rabbitmq的持久化熟悉么,我试了下开启持久化,消费者断开重新连的化,之前的消息并没有接收到
你要确定消息是否发送到了队列中并且已经ack,这时候消费者断开重连是肯定可以接收到的
xuanskyer
xuanskyer
rabbitmq的持久化熟悉么,我试了下开启持久化,消费者断开重新连的化,之前的消息并没有接收到
RabbitMQ与Redis做队列比较

本文仅针对RabbitMQ与Redis做队列应用时的情况进行对比 具体采用什么方式实现,还需要取决于系统的实际需求 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,...

Edwyn王
2015/05/20
0
0
RabbitMQ消息超时时间、队列消息超时时间、队列超时时间

一、为队列设置消息TTL TTL是 Time-To-Live 的缩写,指的是存活时间,RabbitMQ可以为每个队列设置消息的超时时间。 代码中声明如下: 只要给队列设置x-message-ttl 参数,就设定了该队列所有...

哲别0
07/03
0
0
RabbitMQ与Redis队列对比

本文仅针对RabbitMQ与Redis做队列应用时的情况进行对比 具体采用什么方式实现,还需要取决于系统的实际需求 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,...

凯文加内特
2015/05/20
0
0
RabbitMQ中的工作队列(work queues)

工作队列的设计思想:避免立即执行资源密集型任务。 我们将任务封装为消息并将其发送到队列,消费者从队列中取出任务并执行任务。当我们开启了多个消费者的时候,任务将在他们之间共享。 循环...

m0_37884977
05/17
0
0
python使用rabbitMQ介绍二(工作队列模式)

一模式介绍 第一章节的生产-消费者模式,是非常简单的模式,一发一收。在实际的应用中,消费者有的时候需要工作较长的时间,则需要增加消费者。 这时mq实现了一下几个功能: rabbitmq循环调度...

MyStitch
07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

hive分区

hive为啥分区? hive为了避免全表扫描,从而引进分区技术来将数据进行划分。减少不必要数据的扫描,从而提高效率。 hive的分区和MySQL的分区的区别? mysql分区字段用的是表内字段;而hive分...

Mr_yul
29分钟前
1
0
log4j2发送消息至Kafka

title: 自定义log4j2发送日志到Kafka tags: log4j2,kafka 为了给公司的大数据平台提供各项目组的日志,而又使各项目组在改动上无感知。做了一番调研后才发现log4j2默认有支持将日志发送到kaf...

微笑向暖wx
33分钟前
0
0
LINUX中如何查看某个端口是否被占用(转发)

LINUX中如何查看某个端口是否被占用 之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下: 1.netstat -anp |grep 端口号 如下,我以3306为例,netstat -anp |grep 33...

覃大光
今天
1
0
JBolt 1.5.0新版发布,升级到支持最新版JFinal和Jetty,实现了在线更新插件功能

JBolt是一个JFinal极速开发框架 定制版IDE插件 目前仅有Eclipse插件版,Idea插件版正在开发中。 JBolt的详细使用教程请移步到这里 =====版本1.5.0 更新内容 2018年10月13日10:41:52===== 注意...

山东-小木
今天
0
0
laravel 微信支付

1.composer加载laravel微信支付第三方文件 composer require "overtrue/laravel-wechat:~4.0" composer require simplesoftwareio/simple-qrcode 1.3.* //composer生成二维码文件 2.改confi......

vio小黑
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部