如何优雅地关闭正在运行的Kafka Consumer

时间:2019-02-26 18:18:18

标签: apache-kafka kafka-consumer-api spring-kafka

我需要基于某些数据库驱动的属性来打开/关闭Kafka使用者。如何实现。

我想到的一种方法是:当消费者标记关闭时,从消费者抛出异常。并将容器工厂配置定义为

factory.setErrorHandler(new SeekToCurrentErrorHandler());

但是它会主动寻找相同的消息。

有什么方法可以关闭心跳,然后根据需要重新打开。

2 个答案:

答案 0 :(得分:2)

使用者有一些API可以控制其状态:

  • pause() / resume():允许从一组分区中停止/恢复消耗。消费者保持订阅状态(因此没有重新平衡),但是直到恢复后才获取任何新记录

  • unsubscribe():允许更改使用者订阅,如果未订阅任何内容,它将保持与集群的连接。

如果您与消费者“完成”,您也可以致电close()并在需要时开始新的

答案 1 :(得分:2)

您可以stop()start()侦听器容器。

由于您使用的是容器工厂,因此您似乎正在使用@KafkaListener

在这种情况下

@KafkaListener(id = "foo" ...)

然后使用KafkaListenerEndpointRegistry bean ...

registry.getListenerContainer("foo").stop();