有道无术,术尚可求,有术无道,止于术。
文章目录
-
- 概念
- 队列过期
-
- 控制台
- 代码
- 消息过期
- 删除策略
-
- 队列过期
- 消息过期
概念
TTL
全称Time To Live
,是指存活时间或过期时间。当消息到达存活时间后,还没有被消费,会被自动清除。
RabbitMQ
可以对消息设置过期时间,也可以对整个队列(Queue)
设置过期时间。
队列过期
队列过期时间配置有两中方式:
- 控制台
- 代码
控制台
在控制台界面,添加一个队列,点击Message TTL
,会自动添加一个参数x-message-ttl
,该项就是配置过期时间,单位为毫秒。
添加完成后,在队列信息中就会显示TTL
,表示该队列中的消息会有过期时间:
给当前队列绑定一个交换机:
给当前队列发送一个消息:
rabbitTemplate.convertAndSend("bootExchange","ttl.key","HELLO TTL");
在队列中可以看到发送了消息,但过了十秒之后,消息自动消失,证明过期时间生效。
代码
在声明队列时,直接使用参数配置队列过期时间:
/**
* 创建队列
*/
@Bean("bootQueue")
public Queue bootQueue() {
return QueueBuilder.durable("bootQueue").withArgument("x-message-ttl",10000).build();
}
消息过期
再发送消息时,也可是通过消息属性setExpiration
设置过期时间:
// 方式1
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("10000");
return message;
}
};
rabbitTemplate.convertAndSend("bootExchange", "ttl.key", "HELLO TTL", messagePostProcessor);
// 方式2
MessageProperties messageProperties = new MessageProperties();
messageProperties.setExpiration("10000");
Message message = new Message("HELLO TTL".getBytes(), messageProperties);
rabbitTemplate.send("bootExchange", "boot.key", message);
如果同时设置了队列和消息的过期时间,以时间短的为准。
删除策略
消息存入到队列后,是如何知道它过期并删除呢?
队列过期
队列过期时,由于过期时间一致,最先进入队列的消息,肯定最早过期,RabbitMQ
只要定期从队列头开始扫描是否有过期的消息即可。
消息过期
每条消息的过期时间不同,如果要删除所有过期消息势必要扫描整个队列。RabbitMQ
是等消息到达队列顶部即将被消费时,才会判断其是否过期并删除。所以即使消息过期,也不会马上从队列中抹去。
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: