参考资料: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的更多相关文章

  1. 2.RABBITMQ 入门 - WINDOWS - 生产和消费消息 一个完整案例

    关于安装和配置,见上一篇 1.RABBITMQ 入门 - WINDOWS - 获取,安装,配置 公司有需求,要求使用winform开发这个东西(消息中间件),另外还要求开发一个日志中间件,但是也是要求 ...

  2. RabbitMQ入门-从HelloWorld开始

    从读者的反馈谈RabbitMQ 昨天发完<RabbitMQ入门-初识RabbitMQ>,我陆陆续续收到一些反馈.鉴于部分读者希望结合实例来讲 期待下篇详细,最好结合案例.谢谢! 哪都好,唯 ...

  3. RabbitMQ入门-高效的Work模式

    扛不住的Hello World模式 上篇<RabbitMQ入门-从HelloWorld开始>介绍了RabbitMQ中最基本的Hello World模型.正如其名,Hello World模型 ...

  4. RabbitMQ入门-消息订阅模式

    消息派发 上篇<RabbitMQ入门-消息派发那些事儿>发布之后,收了不少反馈,其中问的最多的还是有关消息确认以及超时等场景的处理. 楼主,有遇到消费者后台进程不在,但consumer连接 ...

  5. RabbitMQ入门-Topic模式

    上篇<RabbitMQ入门-Routing直连模式>我们介绍了可以定向发送消息,并可以根据自定义规则派发消息.看起来,这个Routing模式已经算灵活的了,但是,这还不够,我们还有更加多样 ...

  6. RabbitMQ入门与使用篇

    介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非常的优秀 ...

  7. [转]RabbitMQ入门教程(概念,应用场景,安装,使用)

    原文地址:https://www.jianshu.com/p/dae5bbed39b1 RabbitMQ 简介 RabbitMQ是一个在AMQP(Advanced Message Queuing Pr ...

  8. RabbitMQ 入门指南——安装

    RabbitMQ好文 Rabbitmq Java Client Api详解 tohxyblog-博客园-rabbitMQ教程系列 robertohuang-CSDN-rabbitMQ教程系列 Rabb ...

  9. RabbitMQ入门:总结

    随着上一篇博文的发布,RabbitMQ的基础内容我也学习完了,RabbitMQ入门系列的博客跟着收官了,以后有机会的话再写一些在实战中的应用分享,多谢大家一直以来的支持和认可. RabbitMQ入门系 ...

随机推荐

  1. web前端面试小结(1)

    两天大概面试了4家,有电面也有F2F,现将面试中的问题大概汇总下,一方面了解自己的不足,一方面用来勉励自己后面面试加油! 答案网上都有,就不一一写在这里了,后面有时间会把下面的问题分别拉出来详述. 1 ...

  2. String源码详解

    一.基本概念. 1.继承实现关系.因为被final修饰,因此是不可继承的String类,避免被他人继承后修改.实现了三个接口.可序列.可比较,有序.几个String兄弟类 2.本质就是字符数组,同时, ...

  3. 5select的运用

    四.select的运用 --汇总函数 max()最大值,min()最小值,avg()平均值select max(age),min(age),avg(age) from tablename; --算出表 ...

  4. IN的另类写法

    EXPLAIN SELECT * FROM `tcb_capital_log` WHERE id IN(66,79,47) EXPLAIN SELECT * FROM ( SELECT 66 AS i ...

  5. python插入排序算法总结

    插入排序算法总结: 插入算法的核心是 每次循环到一个数时,都认为这个数之前的数列都是排好序的,将一个数插入到已经排好序的有序数列中,从而得到一个新的.个数加一的有序数列. 过程:从第一个元素开始,第一 ...

  6. CentOS安装JDK的三种办法

    方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创建java目录 [root@localhost ~]# mkdir/usr/java[root@localhost ~]# c ...

  7. Hive学习之路 (五)DbVisualizer配置连接hive

    一.安装DbVisualizer 下载地址http://www.dbvis.com/ 也可以从网上下载破解版程序,此处使用的版本是DbVisualizer 9.1.1 具体的安装步骤可以百度,或是修改 ...

  8. ACM题目————Sunscreen

    Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her ...

  9. mamcached+magent构建memcached集群

    cat /etc/redhat-release CentOS release 6.7 (Final) 防火墙.selinux 关闭 192.168.12.30 安装libevent和memcached ...

  10. 20145205 武钰 《网络对抗》Exp8 Web基础

    一点题外话 本次实验我三号完成的,由于一些原因吧,一直没发博客,拖到了现在,这里说就是评判一下自己的懒惰. 实验后问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能. 一个表单有三个基本组成 ...