Rabbitmq的过期时间

tech2022-09-06  104

过期时间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-producer\src\test\java\com\dalianpai\rabbitmq\ProducerTest.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 值,则两者中较小的那个才会起作用。

最新回复(0)