# 1. ttl最大存活時間
TTL是什么呢?TTL是RabbitMQ中一個消息或者隊列的屬性,表明一條消息或者該隊列中的所有消息的最大存活時間,單位是毫秒。換句話說,如果一條消息設置了TTL屬性或者進入了設置TTL屬性的隊列,那么這條消息如果在TTL設置的時間內沒有被消費,
則會成為“死信”(至于什么是死信,請翻看上一篇)。如果同時配置了隊列的TTL和消息的TTL,那么較小的那個值將會被使用。
# 2. 如何設置
## 2.1 聲明隊列的TTL
第一種是在創建隊列的時候設置隊列的“x-message-ttl”屬性,如下:這樣所有被投遞到該隊列的消息都最多不會存活超過6s。
```
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 6000);
channel.queueDeclare(queueName, durable, exclusive, autoDelete, args);
```
## 2.2 指定消息的ttl
通過postProccessr對Message對象進行處理
~~~
public void sendDelayMsg(String msg, Integer delayTime) {
log.info("dely sender send a message: {}",msg);
rabbitTemplate.convertAndSend(DELAYED_EXCHANGE_NAME, DELAYED_ROUTING_KEY, msg, a -> {
a.getMessageProperties().setDelay(delayTime);
a.getMessageProperties().setExpiration("660");
return a;
});
}
~~~
## 2.3 區別
**1.第一種方式如果設置了隊列的TTL屬性,那么一旦消息過期,就會被隊列丟棄。
2.而第二種方式,消息即使過期,也不一定會被馬上丟棄,因為消息是否過期是在即將投遞到消費者之前判定的,如果當前隊列有嚴重的消息積壓情況,則已過期的消息也許還能存活較長時間。
3.如果不設置TTL,表示消息永遠不會過期,如果將TTL設置為0,則表示除非此時可以直接投遞該消息到消費者,否則該消息將會被丟棄。**