此处为 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>
但我希望有比这更优雅的东西......
有什么想法可以做到这一点吗?
最佳答案
也许这种方式对你来说更好:
DeadLetterChannelBuilder errorHandlerBuilder = deadLetterChannel("jms:dummy");
errorHandlerBuilder.onPrepareFailure(exchange -> {
exchange.getIn().setHeader("CamelJmsDestinationName",exchange.getIn().getHeader("JMSDestination",String.class).concat(".DLQ"));
});
from("jms:input1")
.to("seda:process");
from("jms:input2")
.to("seda:process");
from("jms:input3")
.to("seda:process");
from("seda:process").errorHandler(errorHandlerBuilder)
.process(exchange -> {
throw new RuntimeException();
});
您可以在运行时计算 DLQ 队列名称。 DeadLetterChannelBuilder 也可以像 onException 一样进行配置。
关于java - 使用特定于路由的 DLQ 配置 Java/Camel/AMQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52525030/