結合阻塞和非阻塞重試
從 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 的異常。 |
| 非阻塞異常分類行為也取決於特定主題的配置。 |