Camel聚合器不会聚合所有

时间:2015-08-28 05:22:01

标签: apache-camel aggregator

我正在拆分一些java对象然后聚合。我很困惑这个完成策略如何与Camel(2.15.2)一起使用。我正在使用完成大小和完成超时。如果我理解正确,完成超时对它没有太大影响。因为,这里没有太多的等待。

总而言之,我有3000多件物品。但是,似乎只有一部分是汇总的。但是,如果我改变完成大小值,情况会发生变化。如果大小是100,它聚合大约800,如果它是200,它聚合到大约1600.但是,我不提前知道对象的大小,因此,不能依赖于假定的数字。

任何人都可以向我解释我在这里做错了什么吗? 如果我使用eagerCheckCompletion,它会一次性聚合整个事情,这是我不想要的。 以下是我的路线:

   from("direct:specializeddatavalidator")
        .to("bean:headerFooterValidator").split(body())
        .process(rFSStatusUpdater)
        .process(dataValidator).choice()
        .when(header("discrepencyList").isNotNull()).to("seda:errorlogger")
        .otherwise().to("seda:liveupdater").end();


    from("seda:liveupdater?concurrentConsumers=4&timeout=5000")
        .aggregate(simple("${in.header.contentType}"),
                batchAggregationStrategy())
        .completionSize(MAX_RECORDS)
        .completionTimeout(BATCH_TIME_OUT).to("bean:liveDataUpdater");

    from("seda:errorlogger?concurrentConsumers=4")
        .aggregate(simple("${in.header.contentType}"),
                batchAggregationStrategy("discrepencyList"))
        .completionSize(MAX_RECORDS_FOR_ERRORS)
        .completionTimeout(BATCH_TIME_OUT)
        .process(errorProcessor).to("bean:liveDataUpdater");

1 个答案:

答案 0 :(得分:1)

很奇怪,但是如果你想聚合所有分割的消息,你可以简单地使用

.split(body(), batchAggregationStrategy())

根据您希望它的工作方式,您可以使用

.shareUnitOfWork().stopOnException()

有关详细信息,请参阅http://camel.apache.org/splitter.html