RabbitMQ(八)RabbitMQ的过期时间TTL
- Time To Live:生存时间、还能活多久,单位毫秒
- 在这个周期内,消息可以被消费者正常消费,超过这个时间,则自动删除(其实是被称为dead message并投入到死信队列,无法消费该消息)
- RabbitMQ可以对消息和队列设置TTL
- 通过队列设置,队列中所有消息都有相同的过期时间
- 对消息单独设置,每条消息的TTL可以不同(更颗粒化)
设置队列TTL
spring-rabbitmq-producer.xml
<!--重新配置队列-->
<!--
auto-declare="true":自动声明
-->
<rabbit:queue name="test_spring_queue_ttl" auto-declare="true">
<rabbit:queue-arguments>
<!--
x-message-ttl:过期时间后删除消息
-->
<entry key="x-message-ttl" value-type="long" value="5000"></entry>
</rabbit:queue-arguments>
</rabbit:queue>
5秒之后,消息自动删除
设置消息TTL
设置某条消息的ttl,只需要在创建发送消息时指定即可
<!--配置队列-->
<rabbit:queue name="test_spring_queue_ttl_2"></rabbit:queue>
public class Sender2 {
public static void main(String[] args) {
//获取spring的配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-rabbitmq-producer.xml");
//与容器中获取RabbitMQ模板类
RabbitTemplate rabbitTemplate = context.getBean(RabbitTemplate.class);
//创建消息的配置对象
MessageProperties properties = new MessageProperties();
//设置过期时间 3 秒
properties.setExpiration("3000");
//创建消息
Message message = new Message("测试过期时间".getBytes(),properties);
/**
* String routingKey: 指定路由键
* Object object: 发送的数据
*/
rabbitTemplate.convertAndSend("msg.user", message);
System.out.println("消息已发送!");
context.close();
}
}
如果同时设置了queue和message的TTL值,则二者中较小的才会起作用