在很多场景下,我们都有延迟队列的需求。但是默认情况下,RabbitMQ不提供延迟队列相关的功能。不过在上一篇文章中松哥给大家分享了RabbitMQ中的死信队列,结合死信队列的设置和消息过期时间,我们也可以实现延迟队列的功能。今天就一起来看看吧。RabbitMQ其实提供了一个专门的延迟队列插件,有空我们再说。1、什么时候需要延迟队列?首先,让我们谈谈什么时候需要延迟队列。举几个简单的例子。在电商项目中,我们下单的时候,一般需要在20分钟或者30分钟内付款,否则订单会进入异常处理逻辑,被取消,然后进入异常处理逻辑,可以看作是一个延迟队列。我买了一个智能砂锅,可以用来煮粥。上班前把所有的材料都放进锅里,然后定好时间开始煮粥,这样下班后就能喝上香喷喷的粥了。那么这个煮粥器的一条指令也可以看成是一个延迟任务,放到一个延迟队列中,时间到了就执行。公司会议预约系统会在会议预约成功后,在会议开始前半小时通知所有已预约会议的用户。安全工单超过24小时未处理,自动拉企业微信群提醒相关责任人。用户下单外卖后,当距离超时还有10分钟时,会提醒外卖小哥超时即将结束。...我们在很多场景下都需要延迟队列。可能有朋友会说,直接设置定时任务不是更方便吗?如果项目中只有一个这样的延迟队列场景,貌似设置一个定时任务也是可以的,但是如果项目中有很多这样的场景,那么定时任务显然不是最好的解决方案,我们可以通过延迟队列来实现一个通用的解决方案。2.延迟队列实现思路延迟队列实现的思路也很简单,就是我们在上一篇文章中说的DLX(死信交换)+TTL(消息超时)。我们可以把死信队列看成是延迟队列。具体来说,如果一条消息需要延迟30分钟执行,我们将这条消息的有效期设置为30分钟,并为这条消息配置死信开关和死信routing_key,不为这条消息设置消费者这个消息队列,那么30分钟后,这个消息因为还没有被消费者消费,就进入了死信队列。这时,我们有一个消费者在死信队列中“停留”。消息一进入死信队列,立即被消费。这就是延迟队列的实现思路,是不是很简单?3、案例接下来,宋大哥将通过一个简单的案例来演示延迟队列的具体实现。首先准备一个RabbitMQ启动。然后我们创建一个SpringBoot工程,引入RabbitMQ依赖:然后在application.properties中配置RabbitMQ的基本连接信息:spring.rabbitmq.host=localhostspring.rabbitmq.username=guestspring.rabbitmq.password=guestspring.rabbitmq.port=5672接下来我们来配置两个消息队列:一个普通队列,一个死信队列:@ConfigurationpublicclassQueueConfig{publicstaticfinalStringJAVABOY_QUEUE_NAME="javaboy_queue_name";publicstaticfinalStringJAVABOY_EXCHANGE_NAME="javaboy_exchange_name";publicstaticfinalStringJAVABOY_ROUTING_KEY="javaboy_routing_key";publicstaticfinalStringDLX_QUEUE_NAME="dlx_queue_name";publicstaticfinalStringDLX_EXCHANGE_NAME="dlx_exchange_name";publicstaticfinalStringDLX_ROUTING_KEY="dlx_routing_key";/***死信队列*@return*/@BeanQueuedlxQueue(){returnnewQueue(DLX_QUEUE_NAME,true,false,false);}/***死信交换*@return*/@BeanDirectExchangelxExchange(){returnnewDirectExchange(DLX_EXCHANGE_NAME,true,false);}/***绑定死信队列和死信交换*@return*/@BeanBindingdlxBinding(){returnBindingBuilder.bind(dlxQueue()).to(dlxExchange()).with(DLX_ROUTING_KEY);}/***普通消息队列*@return*/@BeanQueuejavaboyQueue(){Map
