【RabbitMQ】09 深入部分P2 消费限流 & TTL

 

 

1、消费限流设置

 就是设置项的2个调整,当然还有前面的手动确认的监听改动处理

https://www.bilibili.com/video/BV15k4y1k7Ep?p=26

 

2、消息过时设置 TTL(Time To Live)

https://www.bilibili.com/video/BV15k4y1k7Ep?p=27

RabbitMQ可以设置消息的存活时间,同样也能设置队列的存活时间

新建一个10秒存活消息的队列:

再新建一个Topic交换机:

在交换机设置中绑定队列:

 

现在发布一条消息,如果10秒内没有消费者服务来接收消息,则RabbitMQ10秒后销毁消息

队列列表盯着这个队列不停刷新等到10秒,这条消息就会被移除了

 

Spring&Java代码配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/rabbit
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    <!--加载配置文件-->
    <context:property-placeholder location="classpath:rabbitmq.properties"/>

    <!-- 定义rabbitmq connectionFactory

        publisher-confirms="true" 消息发送可确认
        publisher-returns="true"
    -->
    <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"/>

    <rabbit:queue id="ttl-queue" name="confirm-test-queue" >
        <rabbit:queue-arguments>
            <!--  过期时间设置10秒 注意这里要指定类型数字 -->
            <entry key="x-message-ttl" value="10000" value-type="java.lang.Integer" />
        </rabbit:queue-arguments>
    </rabbit:queue>
    <!-- 交换机设置-->
    <rabbit:topic-exchange name="ttl-exchange" >
        <rabbit:bindings>
            <rabbit:binding queue="ttl-queue" pattern="ttl.#"  />
        </rabbit:bindings>
    </rabbit:topic-exchange>
</beans>

测试代码:

    /**
     * 消息存活设置
     */
    @Test
    public void ttlTest() {
        for (int i = 0; i < 10; i++) {
            rabbitTemplate.convertAndSend("ttl-exchange", "ttl.info", "hello ttl timeout test ....");
        }
    }

队列经过10秒就会销毁这些消息:

 如果设置消息的TTL

    /**
     * 消息存活设置
     */
    @Test
    public void ttlTest() {
//        for (int i = 0; i < 10; i++) {
//            rabbitTemplate.convertAndSend("ttl-exchange", "ttl.info", "hello ttl timeout test ....");
//        }

        rabbitTemplate.convertAndSend(
                "ttl-exchange",
                "ttl.info",
                "hello ttl timeout test ....",
                message -> {
                    message.getMessageProperties().setExpiration("60000"); // 消息的过期时间 字符串设置  这个时间不能超过队列销毁的时间
                    return message;
                });
    }

队列时限 和 消息时限 的规则就是,取时间短的生效

队列过期 销毁队列内的所有消息

消息过期 只有消息在队列顶端处被判断是否过期,才会被销毁(因为案例只写了一个,直接推到顶端销毁了)

 

 

 

 

 

 

 

 

 

posted @ 2021-10-07 20:32  emdzz  阅读(91)  评论(0编辑  收藏  举报