RabbitMQ-TTL消息存活时间

本文介绍了RabbitMQ中的TTL(Time To Live)特性,包括消息存活时间和队列存活时间的概念,以及如何设置这两种TTL。内容涵盖TTL的工作原理,如消息何时被视为过期,以及设置消息和队列TTL的参数。通过一个简单的测试案例,展示了如何在Spring Boot和RabbitMQ中应用这些设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TTL是什么?

TTL全称Time To Live(存活时间/过期时间) 。

当消息到达存活时间后,还没有被消费,会被自动清除。

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

在这里插入图片描述

TTl:消息的存活时间有两种

  •  1.队列统一过期
    
  •  2.消息单独过期
    

    若设置了队列过期时间,也设置了消息过期时间,以时间短的为准。
    若队列过期后,会将队列中所有消息移除。

    只有消息在队列顶端时(即将被消费时),才会判断它是否过期(被移除掉),以提高轮询效率。

    例如:10条消息在队列中,在队列中间有条5s后就会过期的消息M,而队列过期时间为100s,即使过了5s后,在还未消费到消息M前,M都不会被移除掉,不过该过期的还是过期,轮到消费M时 判断其是否过期,过期了就移除掉

TTL的测试

工程结构跟之前的一样:
在这里插入图片描述

spring-rabbitmq-producer.xml中相关配置:

    <!--加载配置文件-->
    <context:property-placeholder location="classpath:rabbitmq.properties"/>

    <!-- 定义rabbitmq connectionFactory -->
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"
                               publisher-confirms="true"
                               publisher-returns="true"
    />
    <!--定义管理交换机、队列-->
    <rabbit:admin connection-factory="connectionFactory"/>

    <!--定义rabbitTemplate对象操作可以在代码中方便发送消息-->
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"/>
    
    <!--ttl-->
    <rabbit:queue id="test_queue_ttl" name="test_queue_ttl">
        <rabbit:queue-arguments>
            <!--        参数名称            存活时间              设置存活时间值类型,不然为String会报错-->
            <entry key="x-message-ttl" value="100000" value-type="java.lang.Integer"/>
        </rabbit:queue-arguments>
    </rabbit:queue>
    <rabbit:topic-exchange name="test_exchange_ttl" id="test_exchange_ttl">
        <rabbit:bindings>
            <rabbit:binding pattern="ttl.#" queue="test_queue_ttl"/>
        </rabbit:bindings>
    </rabbit:topic-exchange>

ProducerTest中的测试类:

    /**
     * ttl:消息的存活时间
     * 1.队列统一过期
     * 2.消息单独过期
     *  若设置了队列过期时间,也设置了消息过期时间,以时间短的为准
     *  若队列过期后,会将队列中所有消息移除
     *  只有消息在队列顶端时(即将被消费时),才会判断它是否过期(被移除掉),以提高轮询效率
     *      如10条消息在队列中,在队列中间有条5s后就会过期的消息M,而队列过期时间为100s,即使
     *      过了5s后,在还未消费到消息M前,M都不会被移除掉,不过该过期的还是过期,轮到消费M时
     *      判断其是否过期,过期了就移除掉
     */
    @Test
    public void testTtl() throws InterruptedException {
        //队列统一过期
//        for (int i = 0; i < 10; i++) {
//            rabbitTemplate.convertAndSend("test_exchange_ttl","ttl.oh","test ttl..." + i);
//        }

        //消息单独过期
        //消息后处理对象MessagePostProcessor
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration("5000");//设置过期时间
                return message;
            }
        };
                                                                                                                //传入消息后处理对象设置参数
        rabbitTemplate.convertAndSend("test_exchange_ttl","ttl.oh","test ttl...",messagePostProcessor);
    }

小结

  • 设置队列过期时间使用参数: x-message-ttl,单位: ms(毫秒),会对整个队列消息统一过期。
  • 设置消息过期时间使用参数: expiration。单位: ms(毫秒),当该消息在队列头部时(消费时),会单独判断这—消息是否过期。
  • 如果两者都进行了设置,以时间短的为准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值