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