結合封鎖與非封鎖重試
從 2.8.4 版本開始,您可以設定框架同時使用封鎖和非封鎖重試。例如,您可以設定一組例外,這些例外可能會在下一個記錄中觸發錯誤,例如 DatabaseAccessException
,因此您可以先重試相同的記錄幾次,然後再將其傳送到重試主題,或直接傳送到 DLT。
若要設定封鎖重試,請在擴充 RetryTopicConfigurationSupport
的 @Configuration
類別中覆寫 configureBlockingRetries
方法,並新增您想要重試的例外,以及要使用的 BackOff
。預設的 BackOff
是 FixedBackOff
,沒有延遲且嘗試 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。 |
非封鎖例外分類行為也取決於特定主題的組態。 |