フォルダーから XML ファイルを使用するバッチ ルートがあります。グループ化されたドキュメントをフィルタリング、変換し、最終的にディスクに保存します。これはバッチ ルートであるため、sourcefolder を 1 回ポーリングした後にシャットダウンする必要があります。これは、以下のコードで RouteTerminator を使用するためのものです。(で呼び出して続行stopRoute()
しremoveRoute()
ます。)camelContext
routeID
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 比較をサポートしていないため、オプションではありません。
この場合、ルート全体を強制的に停止するにはどうすればよいですか?