我以这种方式写了一个监听器
@Autowired
private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry;
@KafkaListener(containerFactory = "cdcKafkaListenerContainerFactory", errorHandler = "errorHandler")
public void consume(@Payload String message) throws Exception {
...
}
@Bean
public KafkaListenerErrorHandler errorHandler() {
return ((message, e) -> {
kafkaListenerEndpointRegistry.stop();
return null;
});
}
在@KafkaListener
批注中,我指定了错误处理程序,该处理程序只是停止了使用者。
看来可行,但是我有个问题要问。
此范围是否有内置的errorHandler?我已经读过ContainerStoppingErrorHandler
可以使用,但是我不能设置它,因为@KafkaListener
的errorHandler接受KafkaListenerErrorHandler
类型的bean。
我看到了kafkaListenerEndpointRegistry.stop()
;停下来因此,在停止之前,已提交消耗消息的偏移量。
我知道当调用kafkaListenerEndpointRegistry.stop();
且在肯定关闭监听器之前,另一条消息到达该主题时会发生什么情况?
这条消息被消耗了吗?
我想像这种情况
time0: kafkaListenerEndpointRegistry.stop() is called
time1: a message is pushed into the listened topic
time2: kafkaListenerEndpointRegistry.stop() complete graceful stop
我担心时间1可能会收到消息。在这种情况下会发生什么?
答案 0 :(得分:1)
请勿在侦听器中停止容器。
ContainerStoppingErrorHandler
是在容器工厂上设置的,而不是在注释上设置的。
如果您使用的是Spring Boot,只需将错误处理程序声明为Bean,然后Boot会将其连接。
否则将错误处理程序添加到连接工厂bean。
使用此错误处理程序,引发异常将立即停止容器。