0

メッセージをデッド レター チャネル (この場合は activemq キュー) に送信する前にメッセージを数回再試行する errorHandler を Camel ルートに設定しました。私が望むのは、メッセージが最大回数の再試行に失敗し、デッド レター キューに送信されたときにエラー ログを表示することです。

エラー処理とデッド レター チャネルのドキュメントを見ると、RedeliveryPolicy には retriesAttemptedLogLevel と retriesExhaustedLogLevel の 2 つのオプションがあるようです。デフォルトでは、retriesExhaustedLogLevel はすでに LoggingLevel.ERROR に設定されていると思われますが、すべての再試行を使い果たし、メッセージをデッド レター チャネルにルーティングすると、実際には何もログに記録されないようです。

これは、Java DSL による私の errorHandler 定義です。

.errorHandler(this.deadLetterChannel(MY_ACTIVE_MQ_DEAD_LETTER)
    .useOriginalMessage()
    .maximumRedeliveries(3)
    .useExponentialBackOff()
    .retriesExhaustedLogLevel(LoggingLevel.ERROR)
    .retryAttemptedLogLevel(LoggingLevel.WARN))

レベルを明示的に ERROR に設定しましたが、まだ何もログアウトしていないようです (どのログ レベルにも)。一方、retryAttemptedLogLevel は問題なく機能しており、適切な LoggingLevel にログを記録します (つまり、retryAttemptedLogLevel を LoggingLevel.ERROR に設定し、再試行を ERROR ログとして表示できます)。ただし、後続の再試行が成功する可能性がある場合は、再試行ごとに ERROR ログではなく、枯渇した場合に 1 つの ERROR ログのみが必要です。

多分私は何かが欠けているかもしれませんが、retriesExhaustedLogLevel は何もしないようです...または、ErrorHandler が DeadLetterChannel として構成されている場合は何もログに記録しません。まだ必要な構成はありますか、それとも RedeliveryPolicy のこの機能はこの特定の ErrorHandlerFactory に対して実行されませんか?

また、使い果たされたメッセージを送信するためのルートを設定することもできます。これは単にログに記録してデッド レター チャネルにルーティングするだけですが、可能であれば、ErrorHandler に既に組み込まれているものを試して使用することをお勧めします。

4

2 に答える 2

1

ErrorHandler の DeadLetterChannel を直接のエンドポイントに更新しました。2 つの logLevel 構成を同じままにしました。3回の再試行を試みたWARNログを取得しましたが、再試行が使い果たされたことを示すエラーログはありません. ただし、ログに記録する直接配信不能エンドポイントをリッスンする小さなルートを設定しましたが、それは機能しています。

エラーログを枯渇させたいという私の願望に対する直接的な解決策ではありませんが、今のところ許容できる回避策です。

于 2016-05-11T14:54:01.693 に答える