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));
}

结合全局可重试主题的致命异常分类,可以将框架配置为你想要的任何行为,例如让某些异常触发阻止和非阻止重试、仅触发一种或另一种,或在不进行任何类型的重试的情况下直接转到 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 的异常。

非阻止异常分类行为还取决于特定主题的配置。