Apache Camel AggregationStrategy.aggregate接收列表而不是单个对象

时间:2019-05-16 08:05:36

标签: apache-camel

我有以下骆驼路线。

    from("{{trade-publisher.trade-tnc.source-endpoint}}")
        .doTry()
            .bean(clientApi, "search(${body},${header.region})")  //Returns List<Trade> 
            .split(simple("${body}"))
                .parallelProcessing()
                    .doTry()
                        .bean(clientApi,"enrich(${body})") //Passing Trade Object
                    .endDoTry()
                    .doCatch(Exception.class)
                        .log(LoggingLevel.ERROR, "ENRICHMENT-EXCEPTION : ${exception.stacktrace}")  
                    .end()  //End of Inner try catch
            .end()// End of split() and parallelProcessing()
            .aggregate(aggegrationStrategy)
            .exchange()
            .completionTimeout(30000L)
    ...
    ...

但是在下面的汇总中,我在newExchange中得到了List?它不应该传递Trade对象而不是List<Trade>吗?

@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {

2 个答案:

答案 0 :(得分:2)

否,设计是您在拆分器之后获得列表。请参见Splitter EIP documentation,然后查找段落What the Splitter returns

从Camel 2.3开始,它返回原始消息,该消息是Splitter的输入。如果要对各个零件进行处理,则必须在拆分器内进行处理

好吧,您已经在

中做到了
.bean(clientApi,"enrich(${body})")

当您“关闭”分离器时,您可以继续使用分离器之前的原始有效负载。这可能非常方便,但是如果您不需要它,路线通常会在拆分器之后结束。

答案 1 :(得分:0)

假设您希望在拆分器产生的每个交换中调用聚合器,那么您在路由的错误点进行了聚合。

var age =  SpreadsheetApp.getUi().prompt("Please enter the age.").getResponseText();