QueueOperationFailureProcessor

QueueOperationFailureProcessor

我有一条复杂的路线,如下所示(部分):

.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
                            }
                        })
                    .endChoice() //end when
                .end() //end choice
            .end() //end policy
        .end() //end split
.endChoice() //end when

我还定义了以下异常策略:
 onException(JMSException.class)
    .handled(true)
    .process(new QueueOperationFailureProcessor()); // #3 property or header should be accessible here

现在,我的目的是在MsgConverter (#1)中将一个bean设置为Exchange属性(“RECOVERY_DETAIL”),并在QueueOperationFailureProcessor (#3)中检索相同的bean。

通过调试,我可以在in-line processor (#2)中看到属性(“RECOVERY_DETAIL”)。在JMSException上,当我的异常策略生效时,我想在QueueOperationFailureProcessor (#3)中检索属性(“RECOVERY_DETAIL”)。

但是,碰巧的是-QueueOperationFailureProcessor (#3)中可用的Exchange与in-line processor (#2)中可用的交换不同,并且属性(“RECOVERY_DETAIL”)在哪里都找不到。

请帮帮我。

P.S.我的 Camel 版本是2.16.0,我可能无法使用需要版本升级的任何解决方案。

最佳答案

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

09-16 00:54