组合阻塞和非阻塞重试

从 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。
非阻塞异常分类行为还取决于特定主题的配置。