使用特定于路由的 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>

但我希望有比这更优雅的东西......


任何想法我怎么能做到这一点?


PIPIONE
浏览 154回答 2
2回答

慕森卡

可能这种方式对你更好:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DeadLetterChannelBuilder errorHandlerBuilder = deadLetterChannel("jms:dummy");&nbsp; &nbsp; errorHandlerBuilder.onPrepareFailure(exchange -> {&nbsp; &nbsp; &nbsp; &nbsp; exchange.getIn().setHeader("CamelJmsDestinationName",exchange.getIn().getHeader("JMSDestination",String.class).concat(".DLQ"));&nbsp; &nbsp; });&nbsp; &nbsp; from("jms:input1")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .to("seda:process");&nbsp; &nbsp; from("jms:input2")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .to("seda:process");&nbsp; &nbsp; from("jms:input3")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .to("seda:process");&nbsp; &nbsp; from("seda:process").errorHandler(errorHandlerBuilder)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .process(exchange -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });您可以在运行时计算 DLQ 队列名称。DeadLetterChannelBuilder 也可以像 onException 一样进行配置。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java