此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring for Apache Kafka 3.3.9! |
结合阻塞和非阻塞重试
从 2.8.4 开始,您可以将框架配置为同时使用阻塞和非阻塞重试。
例如,您可以有一组异常,这些异常也可能会在下一个记录上触发错误,例如DatabaseAccessException
,因此您可以在将同一记录发送到重试主题之前重试几次,或者直接发送到 DLT。
要配置阻止重试,请覆盖configureBlockingRetries
方法@Configuration
扩展的类RetryTopicConfigurationSupport
并添加要重试的异常,以及BackOff
待使用。
默认值BackOff
是一个FixedBackOff
没有延迟和 9 次尝试。
有关详细信息,请参阅配置全局设置和功能。
@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。 |
非阻塞异常分类行为还取决于特定主题的配置。 |