首页 文章

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

提问于
浏览
2

我正在尝试在Camel Route中构建一个使用REST endpoints 的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调用正在触发多个线程,这很棒 . 我可以通过我想要的响应看到'After Aggregation --->'上面的日志语句,这有它自己的线程 . 但是这个输出会发生什么?如何将其恢复到我的默认Exchange,以便它可以返回到REST调用 .

1 回答

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

相关问题