结合阻塞和非阻塞重试

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

请注意,阻塞重试的行为是白名单式的——您添加的是您 *确实* 想通过这种方式重试的异常;而非阻塞重试的分类则面向 FATAL(致命)异常,因此是黑名单式的——您添加的是您 *不想* 进行非阻塞重试,而是想直接发送到 DLT 的异常。
非阻塞异常分类行为也取决于特定主题的配置。