# 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,则表示除非此时可以直接投递该消息到消费者,否则该消息将会被丢弃。**