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