TTL 是 RabbitMQ 中一个消息或者队列的属性,表明<mark>一条消息或者该队列中的所有消息的最大存活时间,单位是毫秒</mark>。换句话说,如果一条消息设置了 TTL 属性或者进入了设置 TTL 属性的队列,那么这条消息如果在 TTL 设置的时间内没有被消费,则会成为死信。
<br/>
如果同时配置了队列的 TTL 和消息的TTL,那么较小的那个值将会被使用。
<br/>
**1. 两种方式设置 TTL**
(1)在创建队列的时候设置队列的`x-message-ttl`属性。
```java
@Bean("queueA")
public Queue queueA() {
Map<String, Object> args = new HashMap<>(16);
//声明队列的 TTL
args.put("x-message-ttl", 10000);
return QueueBuilder.durable(QUEUE_A).withArguments(args).build();
}
```
(2)在生产者针对每条消息设置 TTL。
```java
rabbitTemplate.convertAndSend("X", "XC", message, processor -> {
//设置消息的TTL为2000ms
processor.getMessageProperties().setExpiration("2000");
return processor;
});
```
<br/>
**2. 两种方式的区别**
设置了队列的 TTL 属性,那么一旦消息过期,就会被队列丢弃,除非配置了死信队列则被丢到死信队列中。
<br/>
设置了消息的 TTL 属性,消息即使过期,也不一定会被马上丢弃,因为<mark>消息是否过期是在即将投递到消费者之前判定的</mark>,如果当前队列有严重的消息积压情况,则已过期的消息也许还能存活较长时间。
<br/>
另外,还需要注意的一点是,如果不设置 TTL,表示消息永远不会过期,如果将 TTL 设置为 0,则表示除非此时可以直接投递该消息到消费者,否则该消息将会被丢弃。
- 消息队列
- 什么是MQ
- MQ的作用
- MQ的分类
- MQ的选择
- RabbitMQ
- RabbitMQ是什么
- 四大核心概念
- 工作原理
- 环境搭建
- windows系统下的搭建
- centos7系统下的搭建
- 常用命令
- 服务相关命令
- 管理用户命令
- 管理队列命令
- 第一个RabbitMQ程序
- 工作队列
- 轮询分发消息
- 消息应答
- 持久化
- 发布确认
- 发布确认原理
- 发布确认策略
- 交换机概念
- 交换机类型
- 无名交换机
- Fanout交换机
- Direct交换机
- Topic交换机
- 死信队列
- 死信概念
- 死信来源
- 死信实战
- 延迟队列
- 什么是延迟队列
- TTL设置方式
- 队列TTL延迟队列
- 消息TTL延迟队列
- 插件打造延迟队列
- 延迟队列总结
- 发布确认高级
- 代码实现
- 回退消息
- 备份交换机
- 幂等性
- 幂等性概念
- 消息重复消费
- 消费端幂等性保障
- 优先级队列
- 使用场景
- 设置优先级
- 惰性队列
- 什么是惰性队列
- 队列的两种模式
- 声明惰性队列
- RabbitMQ集群
- 为什么要搭建集群
- 集群搭建步骤
- 集群工作方式
- 脱离集群
- 镜像队列
- 高可用负载均衡