RabbitMQ入门_09_TTL
参考资料:https://www.rabbitmq.com/ttl.html
A. 为队列设置消息TTL
TTL 是 Time-To-Live 的缩写,指的是存活时间。RabbitMQ 可以为每一个队列设置其内部消息的 TTL。
gordon.study.rabbitmq.ttl.TestPerQueueMsgTtl
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 5000);
consumerChannel.queueDeclare(QUEUE_NAME, false, false, true, args);
如上,只要给队列设置 x-message-ttl 参数,就设定了该队列所有消息的存活时间。时间单位是毫秒,值必须大于等于零(等于零的情况比较复杂,以后再分析)。
RabbitMQ 保证死消息(在队列中的时间超过设定的TTL时间)不会被消费者获得,同时会尽快删除死消息。
消息不会在消费者的缓冲区中过期,也就是说,只要队列在消息过期前将消息推送给消费者,消费者就一定能处理到这条消息。
重新入队(例如被取消确认或信道关闭)的消息的过期时间保留初始值,即不刷新过期时间。
B. 为单条消息设置TTL
也可以为每一条消息设置存活时间。
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder().expiration("500").build();
senderChannel.basicPublish("", QUEUE_NAME, properties, message.getBytes("UTF-8"));
AMQP.BasicProperties 在当前版本使用 Builder 模式创建实例,在此,我们通过设置 expiration 的值来设置消息存活时间为 500 毫秒。
当两种消息 TTL 都被设置时,时间短的 TTL 设置生效。
为消息设置 TTL 有一个问题:RabbitMQ 只对处于队列头部的消息判断是否过期(即不会扫描队列),所以,很可能队列中已存在死消息,但是队列并不知情。这会影响队列统计数据的正确性,妨碍队列及时释放资源。
实验发现,RabbitMQ 对队列头部消息的 TTL 扫描是自发的,即使没有 Consumer 连接在队列上,过期消息也会被正确的移除。这种行为对两种消息TTL 都成立。
C. 队列TTL
通过设置队列TTL,如果指定时间内队列没被使用,则队列自动被删除。
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-expires", 5000);
consumerChannel.queueDeclare(QUEUE_NAME, false, false, true, args);
队列未被使用指未发生以下行为:
- 队列没有被重新申明
- 没有 basicGet 操作发生
- 没有 Consumer 连接在队列上(哪怕队列一直没有消息)
特别的,就算一直有消息进入队列,也不算队列在被使用
RabbitMQ 保证未被使用的队列一定不会在指定的过期时间内被删除,但是不保证能及时删除(试验代码中删除很及时),只能保证在 RabbitMQ 重启后一定已经删除。
过期时间单位也是毫秒,但是与消息TTL 不同在于,队列TTL 值必须大于零。
RabbitMQ入门_09_TTL的更多相关文章
- 2.RABBITMQ 入门 - WINDOWS - 生产和消费消息 一个完整案例
关于安装和配置,见上一篇 1.RABBITMQ 入门 - WINDOWS - 获取,安装,配置 公司有需求,要求使用winform开发这个东西(消息中间件),另外还要求开发一个日志中间件,但是也是要求 ...
- RabbitMQ入门-从HelloWorld开始
从读者的反馈谈RabbitMQ 昨天发完<RabbitMQ入门-初识RabbitMQ>,我陆陆续续收到一些反馈.鉴于部分读者希望结合实例来讲 期待下篇详细,最好结合案例.谢谢! 哪都好,唯 ...
- RabbitMQ入门-高效的Work模式
扛不住的Hello World模式 上篇<RabbitMQ入门-从HelloWorld开始>介绍了RabbitMQ中最基本的Hello World模型.正如其名,Hello World模型 ...
- RabbitMQ入门-消息订阅模式
消息派发 上篇<RabbitMQ入门-消息派发那些事儿>发布之后,收了不少反馈,其中问的最多的还是有关消息确认以及超时等场景的处理. 楼主,有遇到消费者后台进程不在,但consumer连接 ...
- RabbitMQ入门-Topic模式
上篇<RabbitMQ入门-Routing直连模式>我们介绍了可以定向发送消息,并可以根据自定义规则派发消息.看起来,这个Routing模式已经算灵活的了,但是,这还不够,我们还有更加多样 ...
- RabbitMQ入门与使用篇
介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非常的优秀 ...
- [转]RabbitMQ入门教程(概念,应用场景,安装,使用)
原文地址:https://www.jianshu.com/p/dae5bbed39b1 RabbitMQ 简介 RabbitMQ是一个在AMQP(Advanced Message Queuing Pr ...
- RabbitMQ 入门指南——安装
RabbitMQ好文 Rabbitmq Java Client Api详解 tohxyblog-博客园-rabbitMQ教程系列 robertohuang-CSDN-rabbitMQ教程系列 Rabb ...
- RabbitMQ入门:总结
随着上一篇博文的发布,RabbitMQ的基础内容我也学习完了,RabbitMQ入门系列的博客跟着收官了,以后有机会的话再写一些在实战中的应用分享,多谢大家一直以来的支持和认可. RabbitMQ入门系 ...
随机推荐
- IIS注册WEB服务扩展
.net framework和iis那个先装的?如果先装IIS,然后再装.net的话,没有问题.但是如果顺序反了的话,需要在命令行里面执行 C:\Windows\Microsoft.NET\Frame ...
- 总结C#获取当前路径的7种方法
C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...
- 待解决:PDF header signature not found
- Python: 去掉字符串开头、结尾或者中间不想要的字符
①Strip()方法用于删除开始或结尾的字符.lstrip()|rstirp()分别从左右执行删除操作.默认情况下会删除空白或者换行符,也可以指定其他字符. ②如果想处理中间的空格,需要求助其他技术 ...
- 程序猿职场心理学,教你三进三出“斩”HR拿offer(跳槽必看)
摘要: 今天主要涉及到的是 HR 在面试时有哪些套路,这样可以见招拆招,斩获 offer! 今天主要涉及到的是 HR 在面试时有哪些套路,这样可以见招拆招,斩获 offer! 主要包括以下内容: 一. ...
- cojs 强连通图计数1-2 题解报告
OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...
- Rapid 2D-to-3D conversion——快速2D到3D转换
https://blog.csdn.net/qq_33445835/article/details/80143598 目前想做一个关于2D转3D的项目,由于国内资料比较少而且大部分都是基于国外的研究 ...
- xargs 原理&使用
1. 简介 之所以能用到这个命令,是由于很多 linux 命令不支持用管道传递参数,例如 find /sbin -perm +700 | ls -l 这个命令是错误的 find /sbin -perm ...
- MySQL中INSERT的一般用法
原文链接:http://www.blogjava.net/midnightPigMan/archive/2014/12/15/421406.html MySQL中INSERT的一般用法 INSERT语 ...
- 《网络攻防》实验九:web安全基础实践
本次实验在XX同学的指导下完成 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 SQL注入攻击的基本原理,是从客户端合法接口提交特殊的非法代码,让其注入到服务器端执行业务的SQL中去,进而改变 ...