Apache Camel拆分和聚合丢失聚合交换的结果

时间:2014-08-28 13:41:05

标签: apache-camel

我正在尝试在使用REST端点的Camel Route中构建Split / Aggregate模式。它需要一个包含请求详细信息列表的请求对象。我想并行处理请求详细信息,然后将聚合结果返回给调用者。我希望这是同步电话。

这是我的路线中的代码。

from("{{generate.route.endpoint}}")
    .routeId(EXAMPLE_ROUTE_ID)
    .split().method(RequestDetailsSplitter.class).stopOnException().parallelProcessing()
        .to("direct:processRequestDetails")
        .aggregate(header(TRANSACTION_ID_PARAM), responseAggregator)
            .completionSize(simple("${property.CamelSplitSize}"))
            .completionTimeout(5000L).parallelProcessing()
            .log(LoggingLevel.INFO, "After Aggregation ---> ${body}")
     .end()            
    .removeHeaders("*")
    .setHeader(Exchange.HTTP_RESPONSE_CODE, 
               simple(String.valueOf(HttpStatus.SC_CREATED)));

我希望调用的结果是Aggregate调用的输出,我的响应对象。但实际上我得到的是REST调用返回的请求对象?

当我添加更多日志记录语句时,我可以看到Split调用正在触发多个线程,这很棒。我可以在'聚合后--->'上面看到日志语句我想要的回应,这有它自己的线程。但是这个输出会发生什么?如何将其恢复到我的默认Exchange,以便它可以返回到REST调用。

1 个答案:

答案 0 :(得分:2)

来自Apache Camel: Splitter

  

Splitter返回的内容

     

Camel 2.3及更新

     

Splitter默认返回原始输入消息。

     

适用于所有版本

     

您可以通过将自己的策略作为 AggregationStrategy 来实现。

如果您想要汇总拆分的结果,您只需要:

from("{{generate.route.endpoint}}")
   .routeId(EXAMPLE_ROUTE_ID)
   .split().method(RequestDetailsSplitter.class, responseAggregator)
           .stopOnException().parallelProcessing()
           .to("direct:processRequestDetails")
           .end()            
   .log(LoggingLevel.INFO, "After Split aggregate ---> ${body}")
   .removeHeaders("*")
   .setHeader(Exchange.HTTP_RESPONSE_CODE, simple(String.valueOf(HttpStatus.SC_CREATED)));