Combining Blocking and Non-Blocking Retries
从 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。
请注意,阻止重试行为是允许列表——你以这种方式添加你确实想要重试的异常;而非阻止重试分类面向的是致命异常,因此是拒绝列表——你添加你不希望进行非阻止重试、而是希望直接发送到 DLT 的异常。
非阻止异常分类行为还取决于特定主题的配置。