1. 简介
TTL 即 Time to Live,在 RabbitMQ 中,可以为消息和队列设置过期时间。
- 给消息设置过期时间,在指定的时间后就会被 RabbitMQ 清除;
- 给队列设置过期时间,就相当于给队列中的所有消息设置了一个过期时间,这个消息的过期时间与队列的过期时间是相同的。从消息入队列开始算起,经过这个时间后,就会被删除。
2. 给消息指定过期时间
生产者代码如下:
java
@RequestMapping("/ttl")
public String ttl1() {
String messageInfo = "ttl...";
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("10000"); //该消息的过期时间为 10s
return message;
}
};
rabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE, Constants.TTL_ROUTINGKEY, messageInfo, );
return "消息发送成功";
}
运行上述代码,通过观察 RabbitMQ 客户端可以发现,在前 10s 内队列中有消息,超过 10s 后队列中的消息就被删除了。
10s 前:

10 s后:

3. 给队列指定过期时间
在声明队列时使用 ttl 指定过期时间,代码如下:
java
//不指定过期时间
@Bean("ttlQueue1")
public Queue ttlQueue1() {
return QueueBuilder.durable(Constants.TTL_QUEUE1).build();
}
//指定过期时间
@Bean("ttlQueue2")
public Queue ttlQueue2() {
return QueueBuilder.durable(Constants.TTL_QUEUE2).ttl(15000).build(); //设置过期时间为 15s
}
生产者代码如下:
java
@RequestMapping("/ttl")
public String ttl2() {
for (int i = 0; i < 10; i++) {
String messageInfo = "ttl... " + i;
rabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE, Constants.TTL_ROUTINGKEY, messageInfo);
}
return "消息发送成功";
}
运行代码后,观察 RabbitMQ 客户端:
前 15s:

15s 之后:

在前 15s,两个队列中均有信息,但由于 ttl.queue2 设置了 ttl,于是过了 15s 后,ttl.queue2 中的消息就被全部删除了。
4. 同时给队列和消息指定过期时间
当同时给队列和消息指定过期时间后,消息的过期时间就以较小的 ttl 为准。