当前位置: 首页 > 知识库问答 >
问题:

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

邵刚洁
2023-03-14

我试图在使用RESTendpoint的骆驼路由中构建一个分割/聚合模式。它需要一个包含请求详细信息列表的请求对象。我想并行处理请求详细信息,然后将聚合结果返回给调用方。我希望这是一个同步调用。

这是我的路线中的代码。

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

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

当我放入更多的日志语句时,我可以看到Split调用正在触发多个线程,这很好。我可以看到上面的日志语句“聚合后-

共有1个答案

章飞虎
2023-03-14

来自Apache Camel:Splitter:

拆分器返回的内容

骆驼2.3及更新版本:

默认情况下,拆分器将返回原始输入消息。

适用于所有版本

您可以通过将自己的策略作为聚合策略来覆盖这一点。

如果要汇总拆分结果,只需执行以下操作:

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)));
 类似资料:
  • 我试图在聚合器完成后获得一个回复,但是我得到一个异常,我没有指定任何聚合器子项,但是当我指定一个。to()endpoint我没有收到聚合结果。。。这可能吗? 控制器: 聚合器:

  • 我想分割交换消息体(它是MyCustomClass对象的列表),处理它们(一个接一个),然后将所有的交换聚合在一起。拆分可以,一个一个处理也可以,但是我想不出怎么把它们聚合起来。 我不需要复杂的聚合,只需要收集分离的交换列表,并在最终的处理器中处理它们。

  • 目前,我正在与spring integration合作开发新的应用程序,并启动了poc,以了解如何处理故障案例。在我的应用程序中,spring integration将接收来自IBM mq的消息,并根据消息类型验证头信息和到不同队列的路由。传入的消息可能是批量消息,所以我使用了spring integration的拆分器和聚合器,并且对技术工作流程有很好的进展和控制。目前我面临的问题很少,我们有I

  • 问题内容: 简而言之,问题 :执行带有子聚合的查询时,内部聚合为什么在某些情况下会丢失数据? 详细问题 :我有一个带有子聚合(存储桶中的存储桶)的搜索查询,如下所示: 如果我执行此查询,对于某些external_docs,我不会收到与之关联的所有inner_docs。在下面的输出中,有三个用于外部文档key_1的内部文档。 现在,我添加了一个查询,以单选一个反而应该在前20个中使用的externa

  • 问题内容: 想象一下,我有两种记录:一个存储桶和一个项目,其中存储在存储桶中的项目,而存储桶中的项目可能相对较少(通常不超过4个,从不超过10个)。这些记录被压缩为一个(具有更多存储桶信息的项目),并放置在Elasticsearch中。我要解决的任务是通过依赖项属性的过滤查询一次找到500个存储桶(最大),其中包含所有相关项,而我受困于限制/抵消聚合。我该如何执行此类任务?我看到聚合使我可以控制相

  • 问题内容: 我想使用Elasticseach聚合器查询的’size’和’from’属性进行分页。 这可能吗 ? 目前,我只知道size属性= 0可获得无限结果 问题答案: 聚合中的分页功能尚未实现。您可以在大小上使用组合,而在构面中排除特征。