我正在使用注释@KafkaListener
来使用我的应用程序上的主题。我的问题是,如果我在kafka中创建一个新主题,但我的消费者已经在运行,那么消费者似乎不会接受新主题,即使它与我正在使用的topicPattern
匹配。有没有办法定期“刷新”订阅的主题,以便在我正在运行的消费者中挑选和重新平衡新主题?
我正在使用Spring Kafka 1.2.2和Kafka 0.10.2.0。
此致
答案 0 :(得分:3)
您无法在运行时动态添加主题;你必须停止/启动容器才能开始收听新主题。
您可以@Autowire
KafkaListenerEndpointRegistry
并id
停止/启动听众。
您还可以通过在注册表本身上调用stop()
/ start()
来停止/启动所有侦听器。
答案 1 :(得分:3)
实际上是可能的。
它对我来说与Kafka 1.1.1兼容。
Spring在后台使用consumer.subscribe(topicPattern)
,现在是否完全可以由消费者看到消息完全取决于Kafka lib。
有一个名为metadata.max.age.ms
的使用者配置属性,默认为5分钟。它基本上控制了客户多久去一次经纪人那里进行更新,这意味着新主题在长达5分钟的时间内不会被消费者看到。您可以降低此值(例如20秒),并且应该会看到KafkaListener开始更快地从新主题中选择消息。
答案 2 :(得分:0)
以下方式适合我。
ContainerProperties containerProps = new ContainerProperties("topic1", "topic2");
KafkaMessageListenerContainer<Integer, String> container = createContainer(containerProps);
containerProps.setMessageListener(new MessageListener<Integer, String>() {
@Override
public void onMessage(ConsumerRecord<Integer, String> message) {
logger.info("received: " + message);
}
});
container.setBeanName("testAuto");
container.start();
参考:http://docs.spring.io/spring-kafka/docs/1.0.0.RC1/reference/htmlsingle/
在实际应用中,我使用ConcurrentMessageListenerContainer
而不是单线程KafkaMessageListenerContainer
。