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集群
- 為什么要搭建集群
- 集群搭建步驟
- 集群工作方式
- 脫離集群
- 鏡像隊列
- 高可用負載均衡