请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于延迟队列的一个分享

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

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 19:44:18

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

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

1 回复 有任何疑惑可以回复我~
  • 提问者 LBruce #1
    不是的,个人认为虽然延迟消息队列也可以用死信队列来实现,不过不应该用死信队列来实现。哈哈,我用的也是这个RabbitMQ的延迟消息插件。
    回复 有任何疑惑可以回复我~ 2021-04-06 20:19:59
  • 提问者 LBruce #2
    因为死信队列作用不光是存放TTL到期的消息,也包含存放nack等其它消息。如果只是为了个延迟投递就使用死信队列,感觉不是很恰当。而且RabbitMQ安装插件还是挺容易的。
    回复 有任何疑惑可以回复我~ 2021-04-06 20:26:15
  • Moody 回复 提问者 LBruce #3
    感谢分享!
    回复 有任何疑惑可以回复我~ 2021-04-07 09:04:53
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信