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
相关产品推荐
相关产品推荐

