TTL 超时删除
- 队列可以设置超时时间
- 消息可以设置超时时间
- 以时间短的为准
队列超时
队列设置超时时间的设置办法 和 队列过长删除 一样,只要添加参数 x-message-ttl 单位毫秒
queue.addArgument("x-message-ttl", 20 * 1000);
消息超时
- 后处理对象 MessagePostProcessor
public String sendTTL() {
for (int i = 0; i < 10; i++) {
String str = "我是第 " + i + " 条消息\t" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss_SSS").format(new Date());
/**
* 偶数使用队列的过期时间
* 奇数使用自定义过期时间
*/
if (i % 2 == 0) {
rabbitTemplate.convertAndSend(Constants.MY_TTL_FANOUT_EXCHANGE, "", str);
} else {
rabbitTemplate.convertAndSend(Constants.MY_TTL_FANOUT_EXCHANGE, "", str, (message) -> {
message.getMessageProperties().setExpiration("5000");
return message;
});
}
System.out.println("消息发送成功!\t" + str);
}
return "success";
}
测试
当既设置了队列的过期时间,又设置了消息单独的过期时间,以时间短的为准,但是在控制台上查看可能有点不明显,是因为 RabbitMQ 的删除策略导致的,
如果每秒都遍历所有的消息,查看是否过期,那么对性能的损耗较大,收益较小,RabbitMQ 会将队列的顶端的消息去判断是否过期,如果过期了就删除
假设队列的过期时间30秒,消息过期时间5秒,如上述示例,偶数使用队列的过期时间,奇数使用消息单独设置时间,由于奇数并不在队列顶端,所以奇数消息可能过期了,但是控制台查看还是 10 条,可以将队列设置成 60 秒过期,消息设置成 10 秒过期,不停手动刷新,较为容易的查看效果,或者直接点开控制台查看每条消息。