Java Apache Camel聚合路由异常
我想使用ApacheCamel并行多播来处理3条路由,并聚合(等待)其中的2条,同时让第3条独立运行(第3条不应该阻止前两条)。我还需要在“所有”情况下处理这两个,这意味着如果其中一个失败(例如,在处理过程中抛出异常),也应该聚合它 根据我从Camel文档中了解到的情况,只要不指定saystopenexception,该行为就应该是“默认”的。但发生的事情是,除了例外,交换永远不会进入我的聚合策略。奇怪的是,即使存在completionSize(2),aggregate后面的处理器也会被执行 所以我的问题是:聚合后的路由怎么可能在不处理交换的情况下继续,聚合策略中有例外?如何正确解决我的案子?请注意,do.to(“direct:sync”)不是这种情况,因为此异常可能会从完全超出路由的多播聚合部分的路由引发 以下是示例代码(除了RowingProcessor抛出MyException,PropertySetterProcessor不重要): 在OneException块上用continue(true)替换handled(true)。 有关更多信息,请参阅此Java Apache Camel聚合路由异常,java,apache-camel,Java,Apache Camel,我想使用ApacheCamel并行多播来处理3条路由,并聚合(等待)其中的2条,同时让第3条独立运行(第3条不应该阻止前两条)。我还需要在“所有”情况下处理这两个,这意味着如果其中一个失败(例如,在处理过程中抛出异常),也应该聚合它 根据我从Camel文档中了解到的情况,只要不指定saystopenexception,该行为就应该是“默认”的。但发生的事情是,除了例外,交换永远不会进入我的聚合策略。奇怪的是,即使存在completionSize(2),aggregate后面的处理器也会被执行 所
handled(true)停止继续路由,如果您想保留路由,则使用continued(true)代替Headwell,但如果go continued(true),则处理将从停止的位置继续。但我想跳过异常后面的处理器-只路由到direct:sync。无论如何,这并不能解释为什么在处理过程中,聚合策略si只调用了一次。你能得到这个@zdenda.onlinet的答案吗?这是评论中的一个讨论点,OP表示这不太令人满意。你的回答没有提供任何其他澄清OP问题的方式。
CamelContext context = new DefaultCamelContext();
RouteBuilder builder = new RouteBuilder() {
@Override
public void configure() throws Exception {
}
};
builder.onException(MyException.class)
.process(new PropertySetterProcessor("a", "onException"))
.handled(true);
builder.from("direct:input")
.process(new PropertySetterProcessor("a", "before-multicast"))
.multicast()
.parallelProcessing()
.shareUnitOfWork()
.to("direct:part1", "direct:part2", "direct:part3")
builder.from("direct:part1")
.process(new PropertySetterProcessor("a", "part1"))
.to("direct:sync");
builder.from("direct:part2")
.process(new PropertySetterProcessor("a", "part2"))
.process(new ExceptionThrowingProcessor("oops")) // throws MyException
.to("direct:sync");
builder.from("direct:part3")
.process(new PropertySetterProcessor("a", "part3"));
// don't want this to be aggregated within direct:sync
builder.from("direct:sync")
.aggregate(new TestAggregationStrategy())
// strategy.aggregate is called only once (from part1) but not from part2 :(
.constant(true)
.completionSize(2)
.process(new PropertySetterProcessor("a", "after-aggregation"));
context.addRoutes(builder);
context.start();
ProducerTemplate template = context.createProducerTemplate();
template.send("direct:input", new DefaultExchange(context, ExchangePattern.InOut));