结合阻塞和非阻塞重试
从 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。
请注意,阻塞重试的行为是白名单式的——您添加的是您 *确实* 想通过这种方式重试的异常;而非阻塞重试的分类则面向 FATAL(致命)异常,因此是黑名单式的——您添加的是您 *不想* 进行非阻塞重试,而是想直接发送到 DLT 的异常。 |
非阻塞异常分类行为也取决于特定主题的配置。 |