
Spring Kafka 3.0.10 起废弃了 RetryTopicNamesProviderFactory,需改用 RetryTopicConfigurationSupport 或其子类(如 DefaultRetryTopicConfiguration)通过 RetryTopicConfigurer 灵活定制重试主题及 DLT 全名。
spring kafka 3.0.10 起废弃了 retrytopicnamesproviderfactory,需改用 retrytopicconfigurationsupport 或其子类(如 defaultretrytopicconfiguration)通过 retrytopicconfigurer 灵活定制重试主题及 dlt 全名。
在 Spring Kafka 3.0 及更高版本中,重试主题(Retry Topic)和死信主题(DLT)的命名机制已重构:原先基于 RetryTopicNamesProviderFactory 的 Bean 驱动模式被移除,取而代之的是更声明式、可组合的 RetryTopicConfigurationSupport 体系。该抽象类提供了对重试层级、主题命名策略、后缀/前缀、分区数、副本因子等的细粒度控制,并支持完全自定义 DLT 主题全名(而非仅后缀),完美满足您“整个名称变更”的需求。
✅ 正确实现方式:使用 RetryTopicConfigurer
以下是一个完整示例,展示如何为监听器 @KafkaListener(topics = "input-topic") 配置自定义重试链(含 3 级重试 + 全名指定的 DLT):
@Configuration
public class KafkaRetryConfig {
@Bean
public RetryTopicConfigurer retryTopicConfigurer() {
return RetryTopicConfigurer.forTopics("input-topic")
.maxAttempts(4) // 总尝试次数(含原始消费)= 1 + 3 retries
.dltHandlerMethod("dltHandler") // 指向 DLT 处理方法(可选)
.retryTopicSuffix("-retry-") // 可选:重试主题后缀(如 input-topic-retry-1)
.dltName("my-custom-dlt-topic") // ✅ 关键:直接指定 DLT 全名!
.backOffFunction((attempt, ex) -> new FixedBackOff(3000L, 2L)) // 自定义退避
.build();
}
@KafkaListener(id = "input-listener", topics = "input-topic")
public void listen(String data) {
// 业务逻辑,抛异常触发重试
if (data.contains("error")) throw new RuntimeException("Simulated failure");
}
@KafkaListener(id = "dlt-listener", topics = "my-custom-dlt-topic") // 显式监听 DLT
public void dltHandler(String data, @Header(KafkaHeaders.DLT_EXCEPTION_STACKTRACE) String stacktrace) {
System.err.println("DLT received: " + data + ", cause: " + stacktrace);
}
}⚠️ 注意事项:
dltName("my-custom-dlt-topic")是核心——它完全覆盖默认 DLT 命名逻辑(默认为input-topic.DLT),无需任何额外工厂类。RetryTopicConfigurer是线程安全的,支持多 topic 配置(.forTopics("t1", "t2"))。- 若需更底层控制(如动态生成主题名、条件化 DLT 分发),可继承
RetryTopicConfigurationSupport并重写createDltTopicName()或createRetryTopicName()方法。- Spring Kafka 3.0+ 默认启用重试主题自动创建(
auto.create.topics.enable=true推荐开启),但生产环境建议预建主题并显式配置分区与副本。
✅ 总结
RetryTopicNamesProviderFactory 的移除并非功能削弱,而是设计升级:RetryTopicConfigurer 提供了更直观、可测试、可复用的配置 API,且 dltName() 方法直接支持全名定制,完全替代旧方案。迁移时只需替换配置 Bean,无需修改监听器逻辑或消息处理流程,即可无缝启用符合规范的自定义重试与 DLT 策略。


















