• RabbitMQ系列【9】过期时间


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

    概念

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

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

    队列过期

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

    • 控制台
    • 代码

    控制台

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

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

    在队列中可以看到发送了消息,但过了十秒之后,消息自动消失,证明过期时间生效。
    在这里插入图片描述

    代码

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

        /**
         * 创建队列
         */
        @Bean("bootQueue")
        public Queue bootQueue() {
            return QueueBuilder.durable("bootQueue").withArgument("x-message-ttl",10000).build();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    消息过期

    再发送消息时,也可是通过消息属性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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    删除策略

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

    队列过期

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

    消息过期

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

  • 相关阅读:
    GDPU 数据结构 天码行空8
    A66 STM32_HAL库函数 之 USART通用驱动 -- B -- 所有函数的介绍及使用
    【力扣每日一题】2023.9.24 LRU缓存
    不用编程实现USB或串口条码枪对接PLC,将数据写入到寄存器
    SOA、ESB、微服务、分布式概念及专业名词阐述
    机器人C++库(2)Robotics Library AP概述
    OpenGL基本架构知识
    k8s-master 高可用
    Rabin Karp 算法详解及Python实现
    Zabbix 5.2实战系列之Grafana变量使用
  • 原文地址:https://blog.csdn.net/qq_43437874/article/details/127779139