TTL, 即过期时间. RabbitMQ可以对消息和队列设置TTL
当消息到达存活时间之后, 还没有被消费, 就会被⾃动清除
5.1 设置消息的TTL
有两种⽅法可以设置消息的TTL:
a. 设置队列的TTL, 队列中所有消息都有相同的过期时间
b. 对消息本⾝进⾏单独设置
如果两种⽅法⼀起使⽤, 则消息的TTL以两者之间较⼩的那个数值为准.
①对每条消息设置TTL
交换机,队列:
//ttl
@Bean("ttlQueue")
public Queue ttlQueue(){
return QueueBuilder.durable(Constant.TTL_QUEUE).build();
}
@Bean("ttlExchange")
public DirectExchange ttlExchange(){
return ExchangeBuilder.directExchange(Constant.TTL_EXCHANGE).build();
}
@Bean("ttlBinding")
public Binding ttlBinding(@Qualifier("ttlExchange") DirectExchange directExchange, @Qualifier("ttlQueue") Queue queue){
return BindingBuilder.bind(queue).to(directExchange).with("ttl");
}
发送消息:
@RequestMapping("/ttl")
public String ttl(){
// MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
// @Override
// public Message postProcessMessage(Message message) throws AmqpException {
// message.getMessageProperties().setExpiration("10000");//单位毫秒
// return message;
// }
// };
// rabbitTemplate.convertAndSend(Constant.TTL_EXCHANGE,"ttl","ttl test...",messagePostProcessor);
//简写
rabbitTemplate.convertAndSend(Constant.TTL_EXCHANGE,"ttl","ttl test 30s...",message -> {
message.getMessageProperties().setExpiration("30000");//单位毫秒
return message;
});
}
运行程序,看结果:
3s后消失:
5.2 设置队列的TTL
设置队列TTL的⽅法是在创建队列时, 加⼊ x-message-ttl 参数实现的, 单位是毫秒
也可以通过下面代码设置:
下面通过接口,查看:
队列Features有⼀个TTL标识
20s后,消息已被删除
5.3 区别
设置队列TTL属性的⽅法, ⼀旦消息过期, 就会从队列中删除
设置消息TTL的⽅法, 即使消息过期, 也不会⻢上从队列中删除, ⽽是在即将投递到消费者之前进⾏判定的.
为什么这两种⽅法处理的⽅式不⼀样?
因为设置队列过期时间, 队列中已过期的消息肯定在队列头部, RabbitMQ只要定期从队头开始扫描是否有过期的消息即可.
⽽设置消息TTL的⽅式, 每条消息的过期时间不同, 如果要删除所有过期消息需要扫描整个队列, 所以不如等到此消息即将被消费时再判定是否过期, 如果过期再进⾏删除即可
举个例子::
如果消息ttl 10s,队列20s(同时设置)
ttl队列未设置过期时间
ttl2设置过期时间为20s
发送一条ttl为10s消息,取其短
可以发现,当10s后第一条消息没有消失,而是两条一起消失