组合阻塞和非阻塞重试

从 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。

请注意,阻塞重试行为是允许列表 - 你添加你确实想要以这种方式重试的异常;而非阻塞重试分类面向致命异常,因此是拒绝列表 - 你添加你不想进行非阻塞重试的异常,而是直接发送到 DLT。
非阻塞异常分类行为还取决于特定主题的配置。