组合阻塞与非阻塞重试
从 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。
important
请注意,阻塞重试的行为是允许列表(allowlist)——你添加的是希望以这种方式重试的异常;而非阻塞重试的分类则面向 FATAL 异常,因而是拒绝列表(denylist)——你添加的是不希望进行非阻塞重试、而应直接发送到 DLT 的异常。
important
非阻塞异常分类的行为还取决于特定主题的配置。