2015-08-28 130 views
0

我分裂一些Java对象,然后聚合。我有点困惑这个完成策略如何与骆驼(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

奇怪,但如果你要聚集所有分割后的消息,你可以简单地使用

.split(body(), batchAggregationStrategy()) 

,并根据你想要的工作,你可以使用

.shareUnitOfWork().stopOnException() 

更多信息,请参见http://camel.apache.org/splitter.html

+0

感谢您的回答。但是,我想知道,我的最新错误!看来,如果我将seda端点改为直接,它就会像我预期的那样开始工作!不知道为什么! – Mashrur

+0

制作一个简单的测试用例并发布它会有很大帮助:) – J2B

+0

很抱歉,迟到的回复。我希望我有时间做一个简单的测试用例来证明我的观点。无论如何,看起来,应用程序运行的方式还有一些事情要做。这是在一个简单的主要类与一个固定的时间睡眠方法。而且,它也没有我稍后添加的正确完成逻辑。我会分享一些代码,如果有人认为这对他们有用。 – Mashrur