【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系列文章会陆续更新,欢迎各位小伙伴关注后面的技术分享。

相关推荐
脸大是真的好~8 小时前
分布式锁-基于redis实现分布式锁(不推荐)- 改进利用LUA脚本(不推荐)前面都是原理 - Redisson分布式锁
redis·分布式·lua
liuniansilence8 小时前
🚀 高并发场景下的救星:BullMQ如何实现智能流量削峰填谷
前端·分布式·消息队列
Wang's Blog12 小时前
RabbitMQ: 实现高效消息监听之从基础到自动配置
分布式·rabbitmq
Wang's Blog12 小时前
RabbitMQ: 高级特性详解之消息返回机制与消费端确认机制
分布式·rabbitmq
Wang's Blog13 小时前
RabbitMQ: 使用MessageConverter高效处理消息
分布式·rabbitmq
‘胶己人’15 小时前
redis分布式锁
数据库·redis·分布式
山沐与山15 小时前
【MQ】Kafka与RocketMQ深度对比
分布式·kafka·rocketmq
武子康15 小时前
Java-203 RabbitMQ 生产者/消费者工作流程拆解:Connection/Channel、默认交换器、ACK
java·分布式·消息队列·rabbitmq·erlang·ruby·java-rabbitmq
小满、16 小时前
RabbitMQ: 同步异步解析、安装与控制台实践
分布式·消息队列·rabbitmq·mq