我有一個使用文件夾中XML文件的批處理路由。它過濾,轉換並最終將分組文檔保存到磁盤。由於這是批量路由,因此我需要在源文件夾單次輪詢後關閉它,這是以下代碼中RouteTerminator的用途。 (它呼籲camelContext
與routeID
stopRoute()
和removeRoute()
)當所有消息都被過濾時停止路由
from("file:" + sourcePath)
.filter().xquery("//DateTime > xs:dateTime('2013-05-07T23:59:59')")
.filter().xquery("//DateTime < xs:dateTime('2013-05-09T00:00:00')")
.aggregate(constant(true))
.completionFromBatchConsumer()
.groupExchanges()
.to("xquery:" + xqueryPath)
.to("file:" + targetPath)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
new RouteTerminator(routeID, exchange.getContext()).start();
}
})
.end();
單個文件收集後並重復該過程中onException
後也正常關閉路由時異常被拋出這正確關閉的路線。不幸的是,如果路由過濾掉每個Exchange,它永遠不會到達處理器。交易所在過濾器期間被丟棄,並且路線保持打開狀態。
我想移動aggregate
調用中的過濾器,因爲這可能會使路由一直持續到結束,但此方法不會接受XQuery過濾器。 XPath不是一個選項,因爲它不支持dateTime比較。
如何在這種情況下強制停止整條路線?
我發現一個非常hacky的方式,通過插入一個假記錄到bean中的交換和然後在我調用的XQuery中過濾這條記錄,但我顯然更喜歡更清晰的方法。 – Lilienthal 2013-05-08 13:00:35
而不是使用過濾器,你有沒有想過使用CHOICE謂詞 – Joe2013 2013-05-09 08:48:30
@ Joe2013我有,但它沒有很好地工作。您的評論後,我再次嘗試,現在有一個解決方案,我調用'setHeader'來設置一個'過濾'頭。不幸的是,我似乎無法擺脫「choice」將它用作簡單的開關/外殼,所以我必須將'.when()'和'.otherwise()'路由到相同的第二條直接路由。然後,在該路由中,我將聚合並調用一個基本的合併Bean,該合併Bean從每個Exchange構建一個Document,並在頭匹配時將其添加到GenericFile。它似乎應該有一個簡單的方法來簡單地設置一個基於XQuery的標題,雖然... – Lilienthal 2013-05-10 09:07:03