结合阻塞和非阻塞重试
在2.8.4版本中,您可以配置框架同时使用阻塞和非阻塞重试。
例如,您可以设置一组可能会在下一条记录上引发错误的异常,比如DatabaseAccessException,因此您可以在将该记录发送到重试主题或直接发送到死信队列前尝试重试几次相同的记录。
要配置阻塞重试,请覆盖一个继承自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会仅通过阻塞方式重试,如果所有重试都失败,则直接进入死信队列。 -
ShouldRetryViaBothException.class会通过阻塞方式重试,如果所有阻塞重试失败,则会被转发到下一个重试主题进行另一轮尝试。 -
ShouldSkipBothRetriesException.class会直接发送到 DLT,而不会以任何方式重新尝试,并且如果首次处理尝试失败。
| 注意,阻塞重试行为是白名单模式——您需要以这种方式添加您想要重试的异常;而非阻塞重试分类则侧重于致命异常,并且是黑名单模式——您添加的是不想进行非阻塞重试的异常,而是直接发送到死信队列(DLT)中。 |
| 非阻塞异常分类行为还取决于具体主题的配置。 |