【问题标题】:Apache Camel Split and Aggregate Looses Result of Aggregate ExchangeApache Camel 拆分和聚合丢失聚合交换的结果
【发布时间】:2014-08-28 13:41:04
【问题描述】:

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

这是我的路线中的代码。

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 调用正在触发多个线程,这很棒。我可以看到“聚合后--->”上方的日志语句以及我想要的响应,这有它自己的线程。但是这个输出会发生什么?我怎样才能把它恢复到我的默认 Exchange 中,以便它可以返回到 REST 调用。

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    来自Apache Camel: Splitter

    拆分器返回的内容

    Camel 2.3 及更新版本

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

    适用于所有版本

    您可以通过将自己的策略提供为 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)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2022-06-17
      • 2023-03-08
      相关资源
      最近更新 更多