You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Kafka 2.7非阻塞重试如何配置监听器不消费DLT主题

解决方案

Spring Kafka 2.7的非阻塞重试机制已经提供了原生配置项可以直接实现该需求,你只需要在RetryTopicConfigurationBuilder的构造链中添加excludeDltTopic()方法调用即可,配置后当前服务的监听器只会消费主主题和重试主题,不会自动注册DLT的消费者,DLT消息完全由你独立的外部进程处理即可。

注意:添加excludeDltTopic()后,可以移除原有dltHandlerMethod()配置,因为当前服务已经不需要处理DLT消息,该配置不再生效。

修改后的完整配置如下:

@Bean
public ConcurrentKafkaListenerContainerFactory<String, Object> kafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<String, Object> factory
        = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    return factory;
}


@Bean
public RetryTopicConfiguration retryTopicConfiguration(KafkaTemplate<String, Object> template) {
    List<Class<? extends Throwable>> throwableList = Arrays.asList(IllegalArgumentException.class,
        IllegalAccessException.class);

    return RetryTopicConfigurationBuilder
        .newInstance()
        // 新增excludeDltTopic配置,跳过DLT消费者注册
        .excludeDltTopic()
        .exponentialBackoff(delayMs, backoffMultiplier, maxIntervalInMs)
        .maxAttempts(retryAttempt)
        .notRetryOn(throwableList)
        .doNotAutoCreateRetryTopics()
        .listenerFactory(kafkaListenerContainerFactory())
        .setTopicSuffixingStrategy(TopicSuffixingStrategy.SUFFIX_WITH_INDEX_VALUE)
        .create(template);
}

配置生效逻辑

  • 添加excludeDltTopic()后,Spring Kafka在初始化重试主题相关的监听器时,会跳过DLT主题的消费者注册,当前服务的监听器仅订阅主主题和对应索引后缀的重试主题
  • 重试耗尽后的消息仍然会正常投递到DLT主题,不会影响你独立进程消费DLT做通知的逻辑
  • 该配置属于Spring Kafka非阻塞重试的原生内置配置,无需额外自定义拦截器或消费过滤逻辑,性能和兼容性最优

内容的提问来源于stack exchange,提问作者Pat's

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:27:01