0

给定一个使用来自 RabbitMQ 队列的消息的基本MessageListener实现,我如何根据处理时可能引发的异常类型将消息发送到不同的死信队列?

最初发布消息的队列具有x-dead-letter-exchangex-dead-letter-routing-key设置,但在我的情况下这还不够。

万一这很重要,我的应用程序正在使用 Spring 4 和 Spring Amqp。

4

1 回答 1

0

据我了解 RabbitMQ 文档和 Spring AMQP,不可能根据代码内部的条件向不同的 DLQ 发送消息。我这么说的原因是我对调试代码的理解是,当必须将消息发送到 DLQ 时,代码没有指定交换或路由键,RabbitMQ 使用消息发布时定义的那些。

所以,我找到的唯一解决方案是实现这样的东西:

try { try_to_do_useful_stuff(message); } catch (BusinessException e) { resend_the_message_to_business_dlq(message); }

这样,如果抛出业务异常,则手动将消息发送到业务DLQ。当然,有些细节会丢失,例如原始队列,但如果不使用它们,这不是问题。

当抛出非业务异常时,遵循标准路径:重试(如果已配置),然后路由到定义的 DLQ。

于 2014-04-09T08:33:54.793 回答