骆驼路由聚合序列问题

时间:2016-12-18 14:30:30

标签: java apache-camel

我在路由的最后一个中调用transformerBean但是当我调试它时,在调用偶数聚合组件之前首先调用它。

from("direct:processRequest").multicast().parallelProcessing().
    to("bean:abcService?method=getProductInfo",
        "bean:xyzService?method=getProductInfo").
    aggregationStrategy(aggregationStrategy).
    to("bean:transformerBean?method=transform");

我想我在这里遗漏了一些东西。

我的要求是在transformerBean之后致电aggregationStrategy

1 个答案:

答案 0 :(得分:2)

聚合策略的位置有点具有欺骗性。可以这样想:指定用于多播的聚合策略;您没有指定聚合发生的地方。

语义是将aggregationStrategy()调用与多播相关联。可以把它想象成删除代码中指定aggregationStrategy()并将其移动到multicast()调用的行。然后,你剩下三(3)次调用bean:两个调用一个到(),另一个调用另一个调用() 因此,Camel将abcService,xyzService和transformerBean作为多播的一部分进行调用。然后,它调用聚合策略三次。

您可以使用对end()的调用来标记多播的结束。此外,为了使语义更加明确,您可以将聚合策略作为参数传递给multicast()调用。

以下是一个例子:

    from("direct:start")
    .log("after direct:start body=${body}")
    .multicast(new MyAggregationStrategy()).parallelProcessing()
      .to("direct:A")
      .to("direct:B")
    .end()
    .to("direct:C");

    from("direct:A").log("A: ${body}").transform(constant("Body changed by A "));
    from("direct:B").log("B: ${body}").transform(constant("Body changed by B "));
    from("direct:C").log("C: ${body}").transform(constant("C - Post-aggregation "));