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

Apache Camel:如何在拆分和后续异常后在多个交易所之间保留属性或标头?

Apache Camel:如何在拆分和后续异常后在多个交易所之间保留属性或标头?

慕盖茨4494581 2022-09-01 17:37:19
我有一条复杂的路线,如下所示(部分):.when(header("KEY_1").isNull()).choice()    .when(header("KEY_2").isNull())        .split().method(SplitExample.class, "invokeSplitter").streaming().parallelProcessing().executorService(threadPoolExecutor)   // first split                              .policy(requires_new)                .bean(SplitExample.class, "enrich")                .bean(persister,"populateRecordAndXRef")                .bean(initializer, "initialize")                .bean(validator, "validateInMsg")                .bean(suppressResolver, "resolve")                .choice()                    .when(header("KEY_3").isNull())                        .bean(MsgConverter.class,"doInvoke" )  // #1 property or header set here                        .split(body()) // second split                        .bean(validator, "validateOutMsg")                                                         .to(toURI.toArray(new String[ toURI.size()]))                        .process(new Processor() {                            @Override                            public void process(Exchange exchange) throws Exception {                                System.out.println(exchange.getException());  // #2 queue server is shut down here so that transaction failure occurs                                                                   }我还定义了以下异常策略: onException(JMSException.class)            .handled(true)    .process(new QueueOperationFailureProcessor()); // #3 property or header should be accessible here现在,我的目的是将 Bean 设置为 Exchange 属性(“RECOVERY_DETAIL”),并在 中检索相同的 Bean。MsgConverter (#1)QueueOperationFailureProcessor (#3)通过调试,我可以看到 RECOVERY_DETAIL.在 JMSException 上,当我的异常策略启动时,我想检索 中的属性(“RECOVERY_DETAIL”)。in-line processor (#2)QueueOperationFailureProcessor (#3)但碰巧的是 - 可用的交易所与可用的交易所不同,并且该属性(“RECOVERY_DETAIL”)在哪里可以找到。QueueOperationFailureProcessor (#3)in-line processor (#2)请帮帮我。附言:我的骆驼版本是2.16.0,我可能无法使用任何需要版本升级的解决方案。
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

尝试在拆分器上进行设置,您可能会发现异常会按预期传播。.shareUnitOfWork()



查看完整回答
反对 回复 2022-09-01
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

在拆分中发生的异常可能不会一直传播到您的 .您可以尝试定义内部拆分来处理此错误。onExceptiondoTry/doCatch



查看完整回答
反对 回复 2022-09-01
?
阿晨1998

TA贡献2037条经验 获得超6个赞

只是猜测,但由于属性创建和属性使用之间存在拆分器,因此这可能是丢失属性的原因。

拆分器使用现有消息的一部分创建新消息。这里的关键问题是:Camel是否将所有属性和标头从传入消息复制到所有拆分的传出消息?

您可以通过在拆分器中移动属性的创建来轻松尝试此操作。如果该属性在异常处理程序中可用,则拆分器是负责任的。

在这种情况下,您可以自己实现Splitter逻辑(只是一个Java Bean,请参阅Splitter文档的“使用Pojo进行拆分”一章)。您的实现可以考虑属性。


查看完整回答
反对 回复 2022-09-01
  • 3 回答
  • 0 关注
  • 115 浏览

添加回答

举报

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