09、RabbitMQ基础:过期时间

有道无术,术尚可求,有术无道,止于术。

文章目录

    • 概念
  • 队列过期
    • 控制台
    • 代码
  • 消息过期
  • 删除策略
    • 队列过期
    • 消息过期

概念

TTL全称Time To Live,是指存活时间过期时间。当消息到达存活时间后,还没有被消费,会被自动清除。

RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。

队列过期

队列过期时间配置有两中方式:

  • 控制台
  • 代码

控制台

在控制台界面,添加一个队列,点击Message TTL,会自动添加一个参数x-message-ttl,该项就是配置过期时间,单位为毫秒。
*
添加完成后,在队列信息中就会显示TTL,表示该队列中的消息会有过期时间:
*
给当前队列绑定一个交换机:
*
给当前队列发送一个消息:

rabbitTemplate.convertAndSend("bootExchange","ttl.key","HELLO TTL");

在队列中可以看到发送了消息,但过了十秒之后,消息自动消失,证明过期时间生效。
*

代码

在声明队列时,直接使用参数配置队列过期时间:

    /**
     * 创建队列
     */
    @Bean("bootQueue")
    public Queue bootQueue() {
   
     
        return QueueBuilder.durable("bootQueue").withArgument("x-message-ttl",10000).build();
    }

消息过期

再发送消息时,也可是通过消息属性setExpiration设置过期时间:

        // 方式1
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
   
     
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
   
     
                message.getMessageProperties().setExpiration("10000");
                return message;
            }
        };
        rabbitTemplate.convertAndSend("bootExchange", "ttl.key", "HELLO TTL", messagePostProcessor);
        // 方式2
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setExpiration("10000");
        Message message = new Message("HELLO TTL".getBytes(), messageProperties);
        rabbitTemplate.send("bootExchange", "boot.key", message);

如果同时设置了队列和消息的过期时间,以时间短的为准。

删除策略

消息存入到队列后,是如何知道它过期并删除呢?

队列过期

队列过期时,由于过期时间一致,最先进入队列的消息,肯定最早过期,RabbitMQ只要定期从队列头开始扫描是否有过期的消息即可。

消息过期

每条消息的过期时间不同,如果要删除所有过期消息势必要扫描整个队列。RabbitMQ是等消息到达队列顶部即将被消费时,才会判断其是否过期并删除。所以即使消息过期,也不会马上从队列中抹去。

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: