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

相关推荐
小熊美家熊猫系统21 小时前
电子合同技术实现与合规实践
java·开发语言·分布式
齐穗穗21 小时前
Windows下安装rabbitmq
rabbitmq
AI 小老六1 天前
Google AX 控制面拆解:分布式 Agent 如何把断点恢复、审计策略和执行调度收进同一条链路
人工智能·分布式·后端·ai·架构·ai编程
functionflux1 天前
kafka-python:Python 生态中最成熟的 Kafka 客户端
分布式·python·其他·kafka
kyle~1 天前
DDS分布式实时系统---自省机制
开发语言·分布式·机器人·c#·接口·ros2
q21030633721 天前
kafka启动几秒后挂了,重启多次无果
分布式·kafka
码农飞哥1 天前
RocketMQ消费接口设计实战:为什么HTTP回调接口必须吞掉所有异常,始终返回成功?
网络协议·http·中间件·消息队列·rocketmq
凯源智能1 天前
工商业分布式光伏箱变智能监控落地实战
分布式·箱变测控·光伏箱变测控装置·箱变监控系统·箱式变测控装置
沂水弦音1 天前
软控 EI 系列模块优势与竞品对比分析:面向 EtherCAT 分布式 I/O 的工程选型视角
分布式·制造·工业自动化·ethercat·io模块
木心术11 天前
在NVIDIA DGX Spark上部署NemoClaw的实际操作方案以及实际应用便利性。
大数据·分布式·spark