結合封鎖與非封鎖重試

從 2.8.4 版本開始,您可以設定框架同時使用封鎖和非封鎖重試。例如,您可以設定一組例外,這些例外可能會在下一個記錄中觸發錯誤,例如 DatabaseAccessException,因此您可以先重試相同的記錄幾次,然後再將其傳送到重試主題,或直接傳送到 DLT。

若要設定封鎖重試,請在擴充 RetryTopicConfigurationSupport@Configuration 類別中覆寫 configureBlockingRetries 方法,並新增您想要重試的例外,以及要使用的 BackOff。預設的 BackOffFixedBackOff,沒有延遲且嘗試 9 次。請參閱 設定全域設定和功能 以取得更多資訊。

@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。
非封鎖例外分類行為也取決於特定主題的組態。