其他分享
首页 > 其他分享> > RabbitMQ高级特性(三):延迟队列实践

RabbitMQ高级特性(三):延迟队列实践

作者:互联网

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

3.1 什么是延迟队列

延迟队列顾名思义队列里面存放的都是延迟消息;“延迟消息”是值消费者发送消息后,不想让消费者立刻获取到消息,需要等待一定时间后才能被消费掉(和定时任务概念一样)。

使用场景:

3.2 如何使用延迟队列?

RabbitMQ中的延迟队列是利用 过期时间+死信队列 两个特性来实现,实现思路如下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


如上图所示:分别创建5s、10s的过期队列,等到超时后MQ会自动将这些消息投递到设置的死信队列中,然后消费者就可以从死信队列中接收消息来实现延迟接收消息效果。


3.3 定义延迟队列

3.3.1 创建延迟队列

在spring/spring-rabbitmq.xml文件,添加如下内容:


                                                                                     

3.3.2 创建死信交换机/队列

在spring/spring-rabbitmq.xml文件,添加如下内容:


                      

3.4 延迟队列测试

3.4.1 编写发送消息代码

在ProducerTest.java类增加如下方法:


/**  *  * 功能描述: 过期后的消息投递到死信队列  * 消息将会被投递到正常的队列,队列有分别设置5s、10s有效时间,超过时间后消息被投递到死信交换机(队列)  */@Testpublic void messageDelayQueueTest(){   rabbitTemplate.convertAndSend("wx_delay_exchange",                "wx_5s_delay",                "消息1:测试过期后的消息投递到死信交换机,有效时间5s");   rabbitTemplate.convertAndSend("wx_delay_exchange",                "wx_10s_delay",                "消息2:测试过期后的消息投递到死信交换机,有效时间10s");}

3.4.2 投递过程说明

3.4.3 测试验证

运行代码,登录RabbitMQ管理端,未过期消息如下所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

和预期一样创建了3个队列,5s_delay_dlx_queue和10s_delay_dlx_queue可以看做为临时队列用于存放有效期内的消息,当消息过期后会自动投递到wx_delay_dlx_queue死信队列中。

标签:队列,RabbitMQ,delay,死信,5s,10s,延迟,wx
来源: https://blog.51cto.com/u_7117633/2871096