RabbitMQ 高级特性之 TTL

1. 简介

TTL 即 Time to Live,在 RabbitMQ 中,可以为消息和队列设置过期时间。

  • 给消息设置过期时间,在指定的时间后就会被 RabbitMQ 清除;
  • 给队列设置过期时间,就相当于给队列中的所有消息设置了一个过期时间,这个消息的过期时间与队列的过期时间是相同的。从消息入队列开始算起,经过这个时间后,就会被删除。

2. 给消息指定过期时间

生产者代码如下:

java 复制代码
    @RequestMapping("/ttl")
    public String ttl1() {
        String messageInfo = "ttl...";

        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration("10000"); //该消息的过期时间为 10s
                return message;
            }
        };

        rabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE, Constants.TTL_ROUTINGKEY, messageInfo, );

        return "消息发送成功";
    }

运行上述代码,通过观察 RabbitMQ 客户端可以发现,在前 10s 内队列中有消息,超过 10s 后队列中的消息就被删除了。

10s 前:

10 s后:

3. 给队列指定过期时间

在声明队列时使用 ttl 指定过期时间,代码如下:

java 复制代码
    //不指定过期时间
    @Bean("ttlQueue1")
    public Queue ttlQueue1() {
        return QueueBuilder.durable(Constants.TTL_QUEUE1).build();
    }
    
    //指定过期时间
    @Bean("ttlQueue2")
    public Queue ttlQueue2() {
        return QueueBuilder.durable(Constants.TTL_QUEUE2).ttl(15000).build(); //设置过期时间为 15s
    }

生产者代码如下:

java 复制代码
    @RequestMapping("/ttl")
    public String ttl2() {

        for (int i = 0; i < 10; i++) {
            String messageInfo = "ttl... " + i;

            rabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE, Constants.TTL_ROUTINGKEY, messageInfo);
        }

        return "消息发送成功";
    }

运行代码后,观察 RabbitMQ 客户端:

前 15s:

15s 之后:

在前 15s,两个队列中均有信息,但由于 ttl.queue2 设置了 ttl,于是过了 15s 后,ttl.queue2 中的消息就被全部删除了。

4. 同时给队列和消息指定过期时间

当同时给队列和消息指定过期时间后,消息的过期时间就以较小的 ttl 为准。

相关推荐
咩咩啃树皮5 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚5 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白7 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司7 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地8 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun3141599 小时前
TCP超时重传机制是为了解决什么问题?
java
wWYy.9 小时前
分布式:数据复制
分布式
莫逸风11 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898612 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112312 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python