2013-07-03 37 views
0

我試圖在我的路線上運行一個onCompletion()區塊,其中包含一個帶有completionTimeout的聚合定義。看起來好像onCompletion在路由實際完成之前調用,因爲我在AggregateTimeoutChecker日誌條目之前從OnCompletion獲取日誌條目。onComplete and aggregate with completionTimeout

如何讓onComplete等待聚合超時?

當然,我可以在onCompletion上添加大於completionTimeout的延遲,但這會使我的測試變慢。

我的路線是這樣的:

from(fileEndpoint) 
    .bean(externalLogger, "start") 
    .onCompletion() 
     .bean(externalLogger, "end") // <-- Gets called too early 
    .end() 
    .split().tokenize("\n") 
    .bean(MyBean.class) 
    .aggregate(header("CamelFileName"), ...) 
     .completionSize(size) 
     .completionTimeout(500) 
    .bean(AggregatesProcessor.class); // <-- some changes here don't arrive 
             //  at onCompletion 

回答

1

onCompletion()被觸發爲每個到來的交換時,它已經完成了路線。在使用聚合器時,所有未完成聚合的交換都會在聚合器上完成路由,因此您的externalLogger會針對每個要聚合的文件進行調用。

如果你想在聚合後記錄日誌,你可以在aggregate()之後調用記錄器。

如果您需要區分超時和聚合完成情況,可以提供自定義AggregationStrategy以及實現接口CompletionAwareAggregationStrategyTimeoutAwareAggregationStrategy