在使用延迟队列投递消息的时候,出现了这么一种情况
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的错误提示