Java Apache Camel聚合路由异常

Java Apache Camel聚合路由异常,java,apache-camel,Java,Apache Camel,我想使用ApacheCamel并行多播来处理3条路由,并聚合(等待)其中的2条,同时让第3条独立运行(第3条不应该阻止前两条)。我还需要在“所有”情况下处理这两个,这意味着如果其中一个失败(例如,在处理过程中抛出异常),也应该聚合它 根据我从Camel文档中了解到的情况,只要不指定saystopenexception,该行为就应该是“默认”的。但发生的事情是,除了例外,交换永远不会进入我的聚合策略。奇怪的是,即使存在completionSize(2),aggregate后面的处理器也会被执行 所

我想使用ApacheCamel并行多播来处理3条路由,并聚合(等待)其中的2条,同时让第3条独立运行(第3条不应该阻止前两条)。我还需要在“所有”情况下处理这两个,这意味着如果其中一个失败(例如,在处理过程中抛出异常),也应该聚合它

根据我从Camel文档中了解到的情况,只要不指定saystopenexception,该行为就应该是“默认”的。但发生的事情是,除了例外,交换永远不会进入我的聚合策略。奇怪的是,即使存在completionSize(2),aggregate后面的处理器也会被执行

所以我的问题是:聚合后的路由怎么可能在不处理交换的情况下继续,聚合策略中有例外?如何正确解决我的案子?请注意,do.to(“direct:sync”)不是这种情况,因为此异常可能会从完全超出路由的多播聚合部分的路由引发

以下是示例代码(除了RowingProcessor抛出MyException,PropertySetterProcessor不重要):

在OneException块上用continue(true)替换handled(true)。 有关更多信息,请参阅此

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));