【发布时间】:2019-03-02 15:54:21
【问题描述】:
此处为 Java 8/Camel 2.19.x/AMQ 5.15.x。
我有一个 Java 应用程序,它使用 Camel 来使用 AMQ 队列中的消息、处理这些消息并用它们做一些事情。有时,路由的输出会将处理结果备份到另一个队列中以进行进一步的下游处理,但并非总是/必要。典型的 Java/Camel/AMQ 设置。
我的每条路线(我使用 Camel XML DSL)都有一个配置的 <onException> 处理程序,通常如下所示:
<onException useOriginalMessage="true">
<exception>java.lang.Exception</exception>
<redeliveryPolicy logStackTrace="true"/>
<handled>
<constant>true</constant>
</handled>
<log message="${exception.stacktrace}" loggingLevel="ERROR"/>
<rollback markRollbackOnly="true"/>
</onException>
非常简单:记录异常并回滚。
作为 <onException> 处理程序的一部分,我想做的是放置 原始消息(失败并导致抛出异常,不是 例外!)在特定于路由的 DLQ 上(“DLQ”是指可以发送失败消息用于审计/报告/播放目的的队列)
意思是,如果我的应用有 30 个路由,每个路由从 30 个不同的 AMQ 队列消费,我将有 30 个不同的“DLQ”,它们各自的 <onException> 处理程序会将失败的消息发送到。
理想情况下,我希望此配置位于 AMQ 端(同样可能在 activem.xml 或类似内部),这样如果 DLQ 目标需要更改,我就不需要进行代码更改或重新部署。但是,如果只能从 Camel 路线/配置内部进行,那也没关系。
我假设我可以修改每个路由以包含其自己为原始消息定制的目标 DLQ:
<onException useOriginalMessage="true">
<exception>java.lang.Exception</exception>
<redeliveryPolicy logStackTrace="true"/>
<handled>
<constant>true</constant>
</handled>
<log message="${exception.stacktrace}" loggingLevel="ERROR"/>
<rollback markRollbackOnly="true"/>
<to uri="activemq:fizzbuzz.dlq"/>
</onException>
但我希望有比这更优雅的东西......
有什么想法可以做到这一点吗?
【问题讨论】:
标签: java apache-camel activemq dead-letter