如何避免在默认情况下命中致命异常的所有可重试主题



我的团队正在编写一个利用Spring Kafka(2.8.2版(提供的可重试主题机制的服务

@Bean
public ConsumerFactory<String, UploadMessage> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(
this.springProperties.buildConsumerProperties(),
new StringDeserializer(),
new ErrorHandlingDeserializer<>(new KafkaMessageDeserializer()));
}
@Bean
public RetryTopicConfiguration retryTopicConfiguration(KafkaTemplate<String, Object> kafkaTemplate) {
final var retry = this.applicationProperties.retry();
return RetryTopicConfigurationBuilder.newInstance()
.doNotAutoCreateRetryTopics()
.suffixTopicsWithIndexValues()
.maxAttempts(retry.attempts())
.exponentialBackoff(retry.initialDelay(), retry.multiplier(), retry.maxDelay())
.dltHandlerMethod(DeadLetterTopicProcessor.ENDPOINT_HANDLER_METHOD)
.create(kafkaTemplate);
}

KafkaMessageDeserializer是一个自定义的去串行化器,用于解码protobuf编码的消息,并可能在失败时抛出SerializationException。Spring Kafka正确地捕获了这个异常并将其转换为DeserializationException。我觉得有点困惑的是,截获的毒丸消息在最终到达死信主题之前,会击中所有重试主题。显然,它失败了,每一步都会出现完全相同的错误。

我知道RetryTopicConfigurationBuilder::notRetryOn可以用于跳过特定异常类型的重试尝试,但如果我想使用与ExceptionClassifier::configureDefaultClassifier中完全相同的异常列表,该怎么办?有没有一种方法可以在基本上不复制代码的情况下以编程方式访问这些信息?

这是一个很好的建议;它可能应该是默认行为(或者至少是可选的(。

请在GitHub上打开功能请求。

在某种程度上,这里有一个相关的讨论:https://github.com/spring-projects/spring-kafka/discussions/2101

最新更新