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