《RabbitMQ系列教程-第十章-RabbitMQ之延时队列》

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 《RabbitMQ系列教程-第十章-RabbitMQ之延时队列》,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

教程说明



RabbitMQ之延时队列

有时候我们希望消息到达之后不会被立即消费,而是等到指定的时间进行消费,这个时候我们就可以利用延时队列来完成我们的功能

延时队列的应用场景:

1)下一个订单,如果10分钟后还未支付,那么修改其订单状态

2)当用户3天未登录,进行登录提醒、礼包赠送等

3)开启一个会议后,会议达到开始时间时自动更改状态

RabbitMQ中,我们可以借助TTL+死信队列来完成延时队列的效果

延时队列很大程度上解决了我们以前定时器的功能,定时器通常采用每秒、每分钟轮询方式进行,这样不仅效率低,对数据库压力也非常大,代码不够严谨美观;

延时队列工作流程图:

在这里插入图片描述

当一个Producer发送出一个消息之后,设置过期时间并推送到指定的业务队列中(或业务交换机),超过指定的时间不消费,该消息自动成为死信,并交由死信交换机分发给死信队列,消费者只要监听死信队列中的消息即可;

上述案例中Producer直接将消息发送给Queue,也可以发送给业务交换机,然后由业务交换机转发给Queue

7.4.2 案例测试

配置spring.xml:

<!--配置业务队列-->
<rabbit:queue name="test_queue_dlx2" id="test_queue_dlx2">
    <rabbit:queue-arguments>
        <!--3.1 x-dead-letter-exchange:死信交换机名称-->
        <entry key="x-dead-letter-exchange" value="exchange_dlx"/>

        <!--3.2 x-dead-letter-routing-key:发送给死信交换机的routingKey-->
        <entry key="x-dead-letter-routing-key" value="dlx.abc"/>
    </rabbit:queue-arguments>
</rabbit:queue>

测试类:

/**
 * 延迟队列
 * TTL+死信队列
 */
@Test
public void testDelay() {
    //1. 测试过期时间,死信消息
    MessageProperties prop = new MessageProperties();
    // 5s不消费消息将成为死信
    prop.setExpiration("5000");

    Message message = new Message("delay=ttl+dl".getBytes(), prop);

    rabbitTemplate.convertAndSend("test_queue_dlx2", message);
}

测试观察,发送消息到test_queue_dlx2(正常的队列)中,5s没有消费该消息自动到死信队列中;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131789.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!