我有一个复杂的路线,如下(部分):
.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)
中可用的Exchange不同,并且该属性(“RECOVERY_DETAIL”)在哪里都找不到。
请帮帮我。
我的 Camel 版本是2.16.0,我可能无法使用任何需要版本升级的解决方案。
3条答案
按热度按时间kzipqqlq1#
在split内部发生的异常可能不会一直传播到您的
onException
。您可以尝试在split内部定义一个doTry/doCatch
来处理此错误。oxosxuxt2#
只是猜测,但由于在属性创建和属性使用之间存在Splitter,因此可能会丢失属性。
拆分器使用现有消息的一部分创建新消息。Camel是否会将传入邮件的所有属性和标头复制到所有拆分的传出邮件?
您可以通过将属性的创建移动到Splitter内部来轻松地尝试这一点。如果该属性在异常处理程序中可用,则Splitter负责。
在这种情况下,你可以自己实现Splitter逻辑(只是一个Java Bean,请参阅Splitter docs的“使用Pojo进行拆分”一章)。
h79rfbju3#
尝试在拆分器上设置
.shareUnitOfWork()
,您可能会发现异常会按预期传播。Relevant docs here