跳到主要内容

结合阻塞和非阻塞重试

ChatGPT-4o-mini 中英对照 Combining Blocking and Non-Blocking Retries

从 2.8.4 开始,您可以配置框架同时使用阻塞和非阻塞重试。例如,您可以有一组异常,这些异常可能会在下一个记录上触发错误,例如 DatabaseAccessException,因此您可以在将相同记录发送到重试主题或直接发送到 DLT 之前重试几次。

要配置阻塞重试,请在扩展 RetryTopicConfigurationSupport@Configuration 类中重写 configureBlockingRetries 方法,并添加您希望重试的异常,以及要使用的 BackOff。默认的 BackOff 是一个没有延迟和 9 次尝试的 FixedBackOff。有关更多信息,请参见 Configuring Global Settings and Features

@Override
protected void configureBlockingRetries(BlockingRetriesConfigurer blockingRetries) {
blockingRetries
.retryOn(MyBlockingRetryException.class, MyOtherBlockingRetryException.class)
.backOff(new FixedBackOff(3_000, 5));
}
java
备注

结合全局可重试主题的致命异常分类,您可以根据需要配置框架的任何行为,例如让某些异常触发阻塞和非阻塞重试,触发其中一种或另一种,或者直接转到 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);
}
java

在这个例子中:

  • ShouldRetryOnlyBlockingException.class 只会通过阻塞进行重试,如果所有重试都失败,则直接进入 DLT。

  • ShouldRetryViaBothException.class 会通过阻塞进行重试,如果所有阻塞重试都失败,则会转发到下一个重试主题进行另一组尝试。

  • ShouldSkipBothRetriesException.class 在任何情况下都不会被重试,如果第一次处理尝试失败,则直接进入 DLT。

important

请注意,阻塞重试行为是允许列表 - 你添加你希望以这种方式重试的例外;而非阻塞重试分类则针对 FATAL 异常,因此是拒绝列表 - 你添加你不希望进行非阻塞重试的例外,而是直接发送到 DLT。

important

非阻塞异常分类行为还依赖于特定主题的配置。