ブロッキングとノンブロッキングの再試行の組み合わせ

2.8.4 以降では、ブロッキングとノンブロッキングの両方の再試行を組み合わせて使用するようにフレームワークを構成できます。例: DatabaseAccessException など、次のレコードでもエラーをトリガーする可能性のある一連の例外が発生する可能性があるため、同じレコードを再試行トピックに送信する前に、または DLT に直接送信する前に、同じレコードを数回再試行できます。

ブロック再試行を構成するには、RetryTopicConfigurationSupport を継承する @Configuration クラスで configureBlockingRetries メソッドをオーバーライドし、使用する BackOff と共に再試行する例外を追加します。デフォルトの BackOff は、遅延がなく 9 回試行される FixedBackOff です。詳細については、グローバル設定と機能の構成を参照してください。

@Override
protected void configureBlockingRetries(BlockingRetriesConfigurer blockingRetries) {
    blockingRetries
            .retryOn(MyBlockingRetryException.class, MyOtherBlockingRetryException.class)
            .backOff(new FixedBackOff(3_000, 5));
}
グローバルな再試行可能なトピックの致命的な例外分類と組み合わせて、一部の例外でブロック再試行と非ブロック再試行の両方をトリガーしたり、いずれかの種類のみをトリガーしたり、直接アクセスしたりするなど、任意の動作に合わせてフレームワークを構成できます。いかなる種類の再試行も行わない DLT。

両方の構成が連携して機能する例を次に示します。

@Override
protected void configureBlockingRetries(BlockingRetriesConfigurer blockingRetries) {
    blockingRetries
            .retryOn(ShouldRetryOnlyBlockingException.class, ShouldRetryViaBothException.class)
            .backOff(new FixedBackOff(50, 3));
}

@Override
protected void manageNonBlockingFatalExceptions(List<Class<? extends Throwable>> nonBlockingFatalExceptions) {
    nonBlockingFatalExceptions.add(ShouldSkipBothRetriesException.class);
}

この例では:

  • ShouldRetryOnlyBlockingException.class はブロッキングを介してのみ再試行し、すべての再試行が失敗した場合、DLT に直接進みます。

  • ShouldRetryViaBothException.class はブロッキングを介して再試行し、すべてのブロッキング再試行が失敗した場合、別の一連の試行のために次の再試行トピックに転送されます。

  • ShouldSkipBothRetriesException.class は決して再試行されることはなく、最初の処理の試行が失敗した場合は DLT に直接移動します。

再試行のブロック動作は allowlist であることに注意してください。この方法で再試行する例外を追加します。ノンブロッキング再試行の分類は致命的な例外を対象としているため、拒否リストです。ノンブロッキング再試行を実行したくない例外を追加しますが、代わりに DLT に直接送信します。
ノンブロッキング例外分類の動作は、特定のトピックの構成によっても異なります。