该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 Spring for Apache Kafka 4.0.0spring-doc.cadn.net.cn

结合阻塞和非阻塞重试

从 2.8.4 版本开始,你可以配置框架同时使用阻塞和非阻塞重试。 例如,你可以设置一组异常,这些异常很可能在下一条记录中触发错误,例如数据库访问异常所以你可以在发送到重试主题或直接发送到DLT前,多次重试同一条记录。spring-doc.cadn.net.cn

要配置阻挡重试,可以覆盖配置阻挡重试在 A 中的方法@Configuration扩展类重试主题配置支持并添加你想重试的例外,以及退避被使用。 默认退避固定退后没有任何延迟,尝试了9次。 更多信息请参见配置全局设置和功能spring-doc.cadn.net.cn

@Override
protected void configureBlockingRetries(BlockingRetriesConfigurer blockingRetries) {
    blockingRetries
            .retryOn(MyBlockingRetryException.class, MyOtherBlockingRetryException.class)
            .backOff(new FixedBackOff(3_000, 5));
}
结合全局可重试主题的致命异常分类,你可以配置框架以实现任何你想要的行为,比如某些例外同时触发阻塞和非阻塞的重试,只触发一种类型,或者直接进入DLT,不进行任何形式的重试。

这里有一个两种配置协同工作的示例:spring-doc.cadn.net.cn

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

在这个例子中:spring-doc.cadn.net.cn

  • ShouldRetryOnlyBlockingException.class只能通过阻挡重试,如果所有重试都失败,则直接进入DLT。spring-doc.cadn.net.cn

  • ShouldRetry通过BothException.class进行会通过阻塞重试,如果所有阻塞都失败,则会被转发到下一个重试主题进行另一组尝试。spring-doc.cadn.net.cn

  • ShouldSkipBothRetriesException.class如果第一次处理失败,将不会以任何方式重审,且会直接进入DLT。spring-doc.cadn.net.cn

注意,阻塞重试行为是允许列表——你通过这种方式添加你想重试的异常;而非阻塞重试分类则针对致命异常,因此是否认者——但你添加的异常是你不想做非阻塞重试,而是直接发送给DLT。
非阻塞异常分类的行为还取决于具体主题的配置。