0

フォルダーから XML ファイルを使用するバッチ ルートがあります。グループ化されたドキュメントをフィルタリング、変換し、最終的にディスクに保存します。これはバッチ ルートであるため、sourcefolder を 1 回ポーリングした後にシャットダウンする必要があります。これは、以下のコードで RouteTerminator を使用するためのものです。(で呼び出して続行stopRoute()removeRoute()ます。)camelContextrouteID

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 比較をサポートしていないため、オプションではありません。

この場合、ルート全体を強制的に停止するにはどうすればよいですか?

4

1 に答える 1

1

もう一度試してみたところ、 setHeader を呼び出して Filtered ヘッダーを設定するソリューションが得られました。

残念ながら、それを単純なスイッチ/ケースとして使用するという選択肢から抜け出せないように見えるので、.when() と .otherwise() の両方を同じ 2 番目の直接ルートにルーティングする必要があります。

そのルートで、基本的なマージ Bean を集約して呼び出します。このマージ Bean は、すべての Exchange からドキュメントを構築し、ヘッダーが一致する場合はそれを GenericFile に追加します。ただし、xqueryに基づいてヘッダーを設定する簡単な方法があるはずです...

于 2014-06-25T06:07:54.283 に答える