结合阻塞和非阻塞重试
从 2.8.4 开始,您可以配置框架同时使用阻塞和非阻塞重试。例如,您可以有一组异常,这些异常可能会在下一个记录上触发错误,例如 DatabaseAccessException
,因此您可以在将相同记录发送到重试主题或直接发送到 DLT 之前重试几次。
要配置阻塞重试,请在扩展 RetryTopicConfigurationSupport
的 @Configuration
类中重写 configureBlockingRetries
方法,并添加您希望重试的异常,以及要使用的 BackOff
。默认的 BackOff
是一个没有延迟和 9 次尝试的 FixedBackOff
。有关更多信息,请参见 Configuring Global Settings and Features。
@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。
非阻塞异常分类行为还依赖于特定主题的配置。