鉴于一个基本的MessageListener
实现消耗来自RabbitMQ队列的消息,如何根据处理它时可能抛出的异常类型将消息发送到不同的死信队列?
队列是最初发布的消息,其上设置了x-dead-letter-exchange
和x-dead-letter-routing-key
,但在我的情况下这还不够。
如果重要,我的应用程序使用的是Spring 4和Spring Amqp。
答案 0 :(得分: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。