Spring Kafka - 在运行时订阅新主题

时间:2017-07-17 10:47:11

标签: java spring spring-kafka

我正在使用注释@KafkaListener来使用我的应用程序上的主题。我的问题是,如果我在kafka中创建一个新主题,但我的消费者已经在运行,那么消费者似乎不会接受新主题,即使它与我正在使用的topicPattern匹配。有没有办法定期“刷新”订阅的主题,以便在我正在运行的消费者中挑选和重新平衡新主题?

我正在使用Spring Kafka 1.2.2和Kafka 0.10.2.0。

此致

3 个答案:

答案 0 :(得分:3)

您无法在运行时动态添加主题;你必须停止/启动容器才能开始收听新主题。

您可以@Autowire KafkaListenerEndpointRegistryid停止/启动听众。

您还可以通过在注册表本身上调用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