结合阻塞和非阻塞重试
从 2.8.4 版本开始,你可以配置框架同时使用阻塞和非阻塞重试。
例如,你可以设置一组异常,这些异常很可能在下一条记录中触发错误,例如数据库访问异常所以你可以在发送到重试主题或直接发送到DLT前,多次重试同一条记录。
要配置阻挡重试,可以覆盖配置阻挡重试在 A 中的方法@Configuration扩展类重试主题配置支持并添加你想重试的例外,以及退避被使用。
默认退避是固定退后没有任何延迟,尝试了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。 -
ShouldRetry通过BothException.class进行会通过阻塞重试,如果所有阻塞都失败,则会被转发到下一个重试主题进行另一组尝试。 -
ShouldSkipBothRetriesException.class如果第一次处理失败,将不会以任何方式重审,且会直接进入DLT。
| 注意,阻塞重试行为是允许列表——你通过这种方式添加你想重试的异常;而非阻塞重试分类则针对致命异常,因此是否认者——但你添加的异常是你不想做非阻塞重试,而是直接发送给DLT。 |
| 非阻塞异常分类的行为还取决于具体主题的配置。 |