我正在尝试在使用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调用。
答案 0 :(得分:2)
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)));