为了账号安全,请及时绑定邮箱和手机立即绑定

使用特定于路由的 DLQ 配置 Java/Camel/AMQ

使用特定于路由的 DLQ 配置 Java/Camel/AMQ

PIPIONE 2021-10-13 15:39:07
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>但我希望有比这更优雅的东西......任何想法我怎么能做到这一点?
查看完整描述

2 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

可能这种方式对你更好:


             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 一样进行配置。


查看完整回答
反对 回复 2021-10-13
  • 2 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信