【RabbitMQ】Producer之TTL过期时间 - 基于AMQP 0-9-1

这篇文章和大家分享Producer发布消息时如何设置消息过期时间,包括队列级别和消息级别,还有如何设置队列的过期时间。

消息过期时间

给消息设置TTL,在超过TTL值后,消息就会变成dead message(死信),订阅此队列的消费者无法消费(也不是绝地的,后续文章会介绍解决办法)。只需要在申明队列的时候,设置x-message-ttl 值即可,注意这种方式是队列级别的,也就是队列中消息的过期时间都是一样的。下面是代码实现。

复制代码
HashMap args = new HashMap<>();
args.put("x-message-ttl", 5 * 1000);
channel.queueDeclare(queue, true, false, false, args);

如果不设置消息的ttl,消息不会过期;如果ttl设置为0,除非可以直接投递给消费者,否则消息会被丢弃。

每条消息可以设置不同的TTL,所以每条消息在被投递到消费者之前,才会判断消息是否过期,这样就会存在一种情况,后面的消息比前面的先过期,但是消费者依然不能消费到后面的消息,必须前面的消息先被投递到消费者,RabbitMQ就是采用这种方案的。下面用一张图帮助理解。

设置消息级别的过期时间的代码实例如下。

复制代码
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder(); 
builder.deliveryMode(2); // 持久化消息
builder expiration( 60000 ); // 设置 TTL=60000ms
AMQP.BasicProperties properties = builder.build();
channel.basicPublish(exchangeName, routingKey, mandatory, properties, "ttlTestMessage".getBytes());

队列过期时间

RabbitMQ不仅支持消息的TTL,还支持队列级别的TTL,可以通过x-expires 参数控制在队列删除之前处于未使用状态的时间,比如设置为1000,表示队列在1s之内,没有被使用,就会被删除。注意,队列级别的TTL不能设置为0。下面是代码实现。

复制代码
HashMap args = new HashMap<>();
args.put("x-expires", 20000);
channel.queueDeclare(queue, true, false,false, args);

队列级别的TTL和消息级别的TTL不一样,因为不用考虑每条消息的TTL,只要队列到了TTL,就可以被删除。

好了,以上就是关于Producer设置消息级别和队列级别的TTL,以及设置队列本身的TTL

RabbitMQ系列文章会陆续更新,欢迎各位小伙伴关注后面的技术分享。

相关推荐
predisw3 小时前
kafka records deletion policy
分布式·kafka
夏天吃哈密瓜4 小时前
Spark-core-RDD入门
大数据·分布式·spark
肥宅小叽5 小时前
【shardingsphere分布式主键无效】
分布式
悻运7 小时前
如何在sheel中运行Spark
大数据·分布式·spark
悻运8 小时前
Spark处理过程-案例数据清洗
大数据·分布式·spark
漠月瑾-西安9 小时前
信创背景下的分布式数据库备份难题及解决之道
数据库·分布式·信创·数据备份
程序员buddha11 小时前
SpringBoot+Dubbo+Zookeeper实现分布式系统步骤
分布式·zookeeper·dubbo·springboot
啾啾Fun11 小时前
【表设计】外键的取舍-分布式中逐渐消失的外键
分布式·关系型数据库·外键
玄武后端技术栈11 小时前
什么是延迟队列?RabbitMQ 如何实现延迟队列?
分布式·后端·rabbitmq
liyongjun631611 小时前
Redis实现分布式获取全局唯一自增ID的案例。
redis·分布式·全局唯一id