1

onCompletion()の集約定義を含むルートでブロックを実行しようとしていますcompletionTimeout。ログエントリの前onCompletionからログエントリを取得するため、ルートが実際に完了する前に呼び出されるようです。OnCompletionAggregateTimeoutChecker

onComplete集約タイムアウトを待機させるにはどうすればよいですか?

もちろん、completionTimeout よりも大きな遅延を onCompletion に追加することはできますが、それによってテストが大幅に遅くなります。

私のルートは次のようになります。

from(fileEndpoint)
    .bean(externalLogger, "start")
    .onCompletion()
         .bean(externalLogger, "end") // <-- Gets called too early
    .end()
    .split().tokenize("\n")
    .bean(MyBean.class)
    .aggregate(header("CamelFileName"), ...)
         .completionSize(size)
         .completionTimeout(500)
    .bean(AggregatesProcessor.class); // <-- some changes here don't arrive
                                      //     at onCompletion
4

1 に答える 1

1

onCompletion()ルートを完了すると、着信交換ごとにトリガーされます。アグリゲーターを使用する場合、集約を完了していないすべての交換はアグリゲーターでルートを終了するため、集約externalLoggerされる各ファイルに対して get が呼び出されます。

集計後にログを記録したい場合は、 の後にロガーを呼び出すことができますaggregate()

集計のタイムアウトと完了を区別する必要がある場合は、カスタムを提供しAggregationStrategy、インターフェースCompletionAwareAggregationStrategyTimeoutAwareAggregationStrategy.

于 2013-08-07T14:51:37.233 に答える