Rabbitmq的过期时间

过期时间TTL

过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。

  • 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。
  • 第二种方法是对消息进行单独设置,每条消息TTL可以不同。

如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message被投递到死信队列, 消费者将无法再收到该消息。

image-20200902160748223

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 值,则两者中较小的那个才会起作用。

posted @ 2020-09-02 16:12  天宇轩-王  阅读(1653)  评论(2编辑  收藏  举报