結合阻塞和非阻塞重試

從 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。

請注意,阻塞重試行為是允許列表——您新增希望以這種方式重試的異常;而非阻塞重試分類則面向 FATAL 異常,因此是拒絕列表——您新增不希望進行非阻塞重試,而是直接傳送到 DLT 的異常。
非阻塞異常分類行為也取決於特定主題的配置。
© . This site is unofficial and not affiliated with VMware.