2015-08-28 168 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