发生错误时如何关闭KafkaListener

时间:2020-10-14 14:16:44

标签: apache-kafka spring-kafka

我以这种方式写了一个监听器

@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可能会收到消息。在这种情况下会发生什么?

1 个答案:

答案 0 :(得分:1)

请勿在侦听器中停止容器。

ContainerStoppingErrorHandler是在容器工厂上设置的,而不是在注释上设置的。

如果您使用的是Spring Boot,只需将错误处理程序声明为Bean,然后Boot会将其连接。

否则将错误处理程序添加到连接工厂bean。

使用此错误处理程序,引发异常将立即停止容器。