2013-05-08 53 views
0

我有一個使用文件夾中XML文件的批處理路由。它過濾,轉換並最終將分組文檔保存到磁盤。由於這是批量路由,因此我需要在源文件夾單次輪詢後關閉它,這是以下代碼中RouteTerminator的用途。 (它呼籲camelContextrouteIDstopRoute()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比較。

如何在這種情況下強制停止整條路線?

+0

我發現一個非常hacky的方式,通過插入一個假記錄到bean中的交換和然後在我調用的XQuery中過濾這條記錄,但我顯然更喜歡更清晰的方法。 – Lilienthal 2013-05-08 13:00:35

+0

而不是使用過濾器,你有沒有想過使用CHOICE謂詞 – Joe2013 2013-05-09 08:48:30

+0

@ Joe2013我有,但它沒有很好地工作。您的評論後,我再次嘗試,現在有一個解決方案,我調用'setHeader'來設置一個'過濾'頭。不幸的是,我似乎無法擺脫「choice」將它用作簡單的開關/外殼,所以我必須將'.when()'和'.otherwise()'路由到相同的第二條直接路由。然後,在該路由中,我將聚合並調用一個基本的合併Bean,該合併Bean從每個Exchange構建一個Document,並在頭匹配時將其添加到GenericFile。它似乎應該有一個簡單的方法來簡單地設置一個基於XQuery的標題,雖然... – Lilienthal 2013-05-10 09:07:03

回答

1

我再次嘗試,現在有一個解決方案,我打電話setHeader設置過濾頭。

不幸的是,我似乎無法打破使用它作爲簡單的開關/外殼的選擇,所以我必須將.when()和.otherwise()路由到同一個第二直接路由。

在那條路線中,我然後聚合並調用一個基本的合併bean,從每個Exchange構建一個Document,並在標題匹配時將它添加到GenericFile。似乎應該有一個簡單的方法來簡單地設置一個基於xquery頭...

相關問題