关于延迟队列的一个分享

来源:5-12 利用RabbitListener快速实现消息处理器(下)

LBruce

2021-04-06

在使用延迟队列投递消息的时候,出现了这么一种情况
图片描述

1.消息成功投递到了Rabbit, rabbitTemplate的confirmCallback 回调中ack为true。
2.但是rabbitTemplate的returnCallback也被触发了,并且replyCode为312,replyText为NO_ROUTE,表示消息在Exchange路由到Queue的时候出了问题。
3.但是程序实际运行表现为,在延迟时间到期了之后(这里设置为30秒),成功被消费者进行消费。
4.也就是说,returnCallback虽然被触发了,但是延迟消息从投递到消费,这一整个流程都是没问题的。

查阅了一下资料后发现,导致returnCallback被触发的原因是因为设置了Mandatory为true。可以进行如下更改

再声明一个RabbitTemplateBean,这个RabbitTeplate单独用于延迟消息投递,设置Mandatory为false。

图片描述

这样就同时存在了两个RabbitTemplate,一个用于投递延迟消息,mandatory为false,另一个用于投放正常消息,mandatory可以为true,也可以为false,根据场景设置。

在使用了mandatory为false的rabbitTemplate投递延迟消息后,不会再出现NO_ROUTE的错误提示
图片描述

写回答

1回答

Moody

2021-04-06

感谢分享!这里是使用死信进行延时的吗?可以考虑使用延时插件:

https://blog.csdn.net/zhuyu19911016520/article/details/103633482

1
5
Moody
回复
慕UI8449229
没有呢
2022-08-16
共5条回复

RabbitMQ精讲,提升工程实践能力,培养架构思维

消息驱动架构+订单状态机,二次开发,手写分布式事务框架。

470 学习 · 205 问题

查看课程