过期时间TTL
过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。
- 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。
- 第二种方法是对消息进行单独设置,每条消息TTL可以不同。
如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message被投递到死信队列, 消费者将无法再收到该消息。
1. 设置队列TTL
在创建配置类添加如下内容:
/**
* @author WGR
* @create 2020/9/2 -- 15:44
*/
@Configuration
public class RabbitTTLMqConfig {
//队列名称
public static final String TTL_QUEUE = "ttl_queue1";
//声明队列
@Bean("ttlQueue")
public Queue ttlQueue(){
Map<String,Object> arguments = new HashMap<>();
arguments.put("x-message-ttl",60000);
return QueueBuilder.durable(TTL_QUEUE).withArguments(arguments).build();
}
}
然后在测试类 spring-rabbitmq-producersrc estjavacomdalianpai
abbitmqProducerTest.java
中编写如下方法发送消息到上述定义的队列:
/**
* 过期队列消息
* 投递到该队列的消息如果没有消费都将在6秒之后被删除
*/
@Test
public void ttlQueueTest(){
//路由键与队列同名
rabbitTemplate.convertAndSend("ttl_queue1", "发送到过期队列ttl_queue1,6秒内不消费则不能再被消费。");
}
参数 x-message-ttl 的值 必须是非负 32 位整数 (0 <= n <= 2^32-1) ,以毫秒为单位表示 TTL 的值。这样,值 6000 表示存在于 队列 中的当前 消息 将最多只存活 6 秒钟。
如果不设置TTL,则表示此消息不会过期。如果将TTL设置为0,则表示除非此时可以直接将消息投递到消费者,否则该消息会被立即丢弃。
2. 设置消息TTL
消息的过期时间;只需要在发送消息(可以发送到任何队列,不管该队列是否属于某个交换机)的时候设置过期时间即可。在测试类中编写如下方法发送消息并设置过期时间到队列:
/**
* 过期消息
* 该消息投递任何交换机或队列中的时候;如果到了过期时间则将从该队列中删除
*/
@Test
public void ttlMessageTest(){
MessageProperties messageProperties = new MessageProperties();
//设置消息的过期时间,3秒
messageProperties.setExpiration("3000");
Message message = new Message("测试过期消息,3秒钟过期".getBytes(), messageProperties);
//路由键与队列同名
rabbitTemplate.convertAndSend("ttl_queue1", message);
}
expiration 字段以豪秒为单位表示 TTL 值。且与 x-message-ttl 具有相同的约束条件。因为 expiration 字段必须为字符串类型,broker 将只会接受以字符串形式表达的数字。
当同时指定了 queue 和 message 的 TTL 值,则两者中较小的那个才会起作用。