java - 使用特定于路由的 DLQ 配置 Java/Camel/AMQ
问题描述
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 一样配置。
推荐阅读
- javascript - 如何使用数据属性对列表项进行分组?
- javascript - 使用自定义规则进行元素排序
- c - 您可以在 C 中进行重载并具有相同的函数名吗?
- php - 为什么 PHP Simple DOM 库不适用于 PHP 7.4.5?
- sql - SQL - 将单元格/行输出附加到现有列名
- php - 登录功能的 PHP 会话无法正常工作
- java - 来自 Firebase 的 dataSnapshot.getValue(MyClass.class) 在开发中工作正常,但在发布到 Play 商店后得到空值
- docker - 如何将字典和列表成员添加到键中?
- excel - 检测新的 Excel 溢出模式并重置它
- angular - 使用spring security的auth api调用的交叉错误