Spring Boot Kafka手动ACK启动报错:找不到kafkaManualAckListenerContainerFactory Bean
解决Spring Kafka手动ACK时找不到
kafkaManualAckListenerContainerFactory的问题 你的问题
你想要实现一个Spring Boot Kafka监听组件并手动ACK消息,写了这样的代码:
@SpringBootApplication public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } @KafkaListener(topics = "sample_log", containerFactory = "kafkaManualAckListenerContainerFactory") public void listen(ConsumerRecord<?, ?> cr, Acknowledgment ack) throws Exception { process(cr); ack.acknowledge(); } }
但启动时直接报错:
*************************** APPLICATION FAILED TO START *************************** Description: A component required a bean named 'kafkaManualAckListenerContainerFactory' that could not be found. Action: Consider defining a bean named 'kafkaManualAckListenerContainerFactory' in your configuration.
你以为Spring Kafka框架已经内置了这个Bean,想知道不用手动定义它怎么解决这个问题。
为什么会报错?
其实Spring Boot的自动配置只默认提供了名为kafkaListenerContainerFactory的容器工厂Bean,并没有预设kafkaManualAckListenerContainerFactory这个Bean。官方文档里提到的手动ACK能力,是通过修改默认工厂的ACK模式来实现的,不是用一个现成的特殊工厂。
无需手动定义Bean的解决办法
你完全不用自己写配置类创建新的Bean,只需要在配置文件里修改默认工厂的ACK模式就行:
用application.properties配置:
spring.kafka.listener.ack-mode=MANUAL
用application.yml配置:
spring: kafka: listener: ack-mode: MANUAL
然后修改你的@KafkaListener注解,要么去掉containerFactory属性(默认就用kafkaListenerContainerFactory),要么显式指定默认Bean名称:
// 两种写法都可以 @KafkaListener(topics = "sample_log") // 或者 @KafkaListener(topics = "sample_log", containerFactory = "kafkaListenerContainerFactory") public void listen(ConsumerRecord<?, ?> cr, Acknowledgment ack) throws Exception { process(cr); ack.acknowledge(); }
这样改完之后,默认的容器工厂就会切换成手动ACK模式,你的监听方法就能正常接收Acknowledgment参数并手动确认消息了。
内容的提问来源于stack exchange,提问作者ccshih
相关产品推荐
相关产品推荐

