- TTL 全称 Time To Live(存活时间/过期时间)。
- 当消息到达存活时间后,还没有被消费,会被自动清除。
- RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。
因为是针对队列消息的时间设置,肯定是在生产者端进行操作。
1、web管理界面设置
1:新建队列时,设置队列里的消息的过期时间
效果:消息发布之后,到了过期时间队列的消息将消失。
2、代码设置(以整合spring的rabbitmq为例)
2.1、统一过期
统一过期需要在声明队列的时候设置
1、在配置文件声明队列时,加上x-message-ttl
参数,如下:
这样在发送消息到队列之后,消息在ttl到了就自动在队列中去除。
2.2 单独过期
单独过期需要在发送消息的时候设置
1、在配置文件设置队列、交换机绑定略;
2、发送消息时候设置过期时间:
public void send(){
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("5000");
return message;
}
};
for (int i = 0; i <10 ; i++) {
//发送消息
rabbitTemplate.convertAndSend("test_exchange_ttl", "ttl.xx", "ttl消息-----------",messagePostProcessor);
}
}
给单独的消息设置过期时间是通过实现匿名类MessagePostProcessor
的一个方法实现的。message.getMessageProperties().setExpiration("5000");
传入的参数类型是字符串,但是内部会转换成毫秒值。
PS:独列消息的单独过期是当消息处于队列的顶端再开始倒计时过期,如果不在顶端那么消息是不会过期的,所以一般设置TTL都是针对整个队列。
总结:
- 设置队列过期时间使用参数:x-message-ttl,单位:ms(毫秒),会对整个队列消息统一过期。
- 设置消息过期时间使用参数:expiration。单位:ms(毫秒),当该消息在队列头部时(消费时),会单独判断这一消息是否过期。
- 如果两者都进行了设置,以时间短的为准。