2015-05-13 100 views
2

路由A由quartz2組件觸發(根據cron時間表)。當路由A在某些情況下完成它的業務邏輯時,我需要觸發路由B,它將讀取給定目錄中的所有文件並將結果發送到另一個路由C,但不希望讓路由B始終運行。如何使用Apache Camel觸發路由並收集結果?

如何在路由A需要時只運行一次路由B?目前,我在路由A中使用'controlbus:'命令啓動路由B(autoStart = false),路由C再次使用'controlbus:'來停止路由B.能否爲我的用例提出更好的解決方案?

回答

2

類似的討論here可能會有所幫助。

+0

這是有幫助謝謝投票將被停止。我在路由A中實現了createPollingConsumer(),但它只返回目錄中的第一個文件,但我需要返回所有這些文件。 (我原來的路由B的實現使用聚合策略來返回給定目錄中的所有文件。) –

0

'路由A'實現池查詢消費者輪詢來自給定目錄(當我們迭代)的所有文件。我們收到空體(檢查http://camel.apache.org/file2.html sendEmptyMessageWhenIdle選項)

public void process(Exchange exchange) throws Exception { 

List<GenericFile> result = new ArrayList<GenericFile>();  
String endpointUrl = "file:////tmp?sendEmptyMessageWhenIdle=true" 
PollingConsumer pConsumer = camelContext.getEndpoint(endpointUrl).createPollingConsumer(); 

pConsumer.start(); 

GenericFile<File> gFile; 

do { 
    Exchange ex = pConsumer.receive(SCAN_TIMEOUT); 
    gFile = (GenericFile<File>) ex.getIn().getBody(); 
    if(gFile != null) { 
     result.add(gFile); 
    } 
// use &sendEmptyMessageWhenIdle=true in file endpoint url OR set receive timeouts otherwise you will never know when folder scan has finished !!! 
} while(gFile != null); 

pConsumer.stop(); 

// other business logic 

}