rabbitmq 的 TTL

队列的 TTL

我们可以通过 ttl() 设置超时时间,单位是 ms

代码演示:

java 复制代码
    @Bean("ttlQueue")
    public Queue ttlQueue() {
        return QueueBuilder.durable(MQConstants.TTL_QUEUE).ttl(20000).build();
    }

设置超时时间为 20s,这样在这条队列的所有的消息的过期时间都是 20s 【前提是你没有给消息单独设置过 TTL】

我们会发现队列多了一个属性 TTL,可以看到过期时间 为 20 000 ms

消息的 TTL

这里需要传入一个字符串,单位为毫秒

在发送消息那行代码将过期时间设置进去

java 复制代码
    @RequestMapping("/ttl")
    public String ttl() {
        rabbitTemplate.convertAndSend(MQConstants.TTL_EXCHANGE, MQConstants.TTL_ROUTING_KEY, "ttl",
                messagePostProcessor -> {
                    messagePostProcessor.getMessageProperties().setExpiration("10000");
                    return messagePostProcessor;
                });
        return "消息发送成功";
    }

两者之间的区别

设置队列TTL属性的方法,一旦消息过期,就会从队列中删除设置消息TTL的方法,即使消息过期,也不会马上从队列中删除,而是在即将投递到消费者之前进行判定的。这样子做可以提高性能

为什么这两种方法处理的方式不一样?
因为设置队列过期时间,队列中已过期的消息肯定在队列头部,RabbitMQ只要定期从队头开始扫描是否有过期的消息即可。
而设置消息TTL的方式,每条消息的过期时间不同,如果要删除所有过期消息需要扫描整个队列,所以不如等到此消息即将被消费时再判定是否过期,如果过期再进行删除即可。

总结

有两种方法可以设置消息的TTL.
一是设置队列的TTL,队列中所有消息都有相同的过期时间
二是对消息本身进行单独设置,每条消息的TTL可以不同
如果两种方法一起使用,则消息的TTL以两者之间较小的那个数值为准。

相关推荐
AC赳赳老秦几秒前
代码生成超越 GPT-4:DeepSeek-V4 编程任务实战与 2026 开发者效率提升指南
数据库·数据仓库·人工智能·科技·rabbitmq·memcache·deepseek
惊讶的猫1 小时前
rabbitmq初步介绍
分布式·rabbitmq
惊讶的猫3 小时前
AMQP 与 RabbitMQ 四大模型
分布式·rabbitmq
像少年啦飞驰点、5 小时前
从零开始学 RabbitMQ:小白也能懂的消息队列实战指南
java·spring boot·微服务·消息队列·rabbitmq·异步编程
lekami_兰5 小时前
RabbitMQ 延迟队列实现指南:两种方案手把手教你搞定
后端·rabbitmq·延迟队列
为什么不问问神奇的海螺呢丶20 小时前
n9e categraf rabbitmq监控配置
分布式·rabbitmq·ruby
m0_687399841 天前
telnet localhost 15672 RabbitMQ “Connection refused“ 错误表示目标主机拒绝了连接请求。
分布式·rabbitmq
Ronin3051 天前
日志打印和实用 Helper 工具
数据库·sqlite·rabbitmq·文件操作·uuid生成
坊钰3 天前
【Rabbit MQ】Rabbit MQ 的结构详解,传输机制!!!
java·rabbitmq
请叫我头头哥4 天前
SpringBoot进阶教程(八十九)rabbitmq长链接及域名TTL,多机房切换配置重连能力
rabbitmq·springboot