kafka consumer to dynamically detect topics added

后端 未结 3 1422
庸人自扰
庸人自扰 2021-01-06 03:04

I\'m using KafkaConsumer to consume messages from Kafka server (topics)..

  • It works fine for topics created before starting Consumer code...

But

相关标签:
3条回答
  • 2021-01-06 03:31

    Here is the solution it worked for me by using KafkaConsumer api. Here is the Java code for it.

    private static Consumer<Long, String> createConsumer(String topic) {
        final Properties props = new Properties();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
                BOOTSTRAP_SERVERS);
        props.put(ConsumerConfig.GROUP_ID_CONFIG,
                "KafkaExampleConsumer");
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
                StringDeserializer.class.getName());
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
                StringDeserializer.class.getName());
        // Create the consumer using props.
        final Consumer<Long, String> consumer =
                new KafkaConsumer<>(props);
        // Subscribe to the topic.
        consumer.subscribe(Collections.singletonList(topic));
        return consumer;
    }
    
    public static void runConsumer(String topic) throws InterruptedException {
        final Consumer<Long, String> consumer = createConsumer(topic);
    
        ConsumerRecords<Long, String> records = consumer.poll(100);
        for (ConsumerRecord<Long, String> record : records)
            System.out.printf("hiiiii offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
        consumer.commitAsync();
        consumer.close();
        //System.out.println("DONE");
    }
    

    using this we can consume the message from dynamically created topics.

    0 讨论(0)
  • 2021-01-06 03:33

    You can hook into Zookeeper. Check out the sample code. In essence, you will create a watcher on the Zookeeper node /brokers/topics. When new children are added here, it's a new Topic being added, and your watcher will get triggered.

    Note that the difference between this and the other answer is that this one is a trigger where the other is a polling -- this one will be as close to real-time as possible, the other will be within whatever your polling interval is at best.

    0 讨论(0)
  • 2021-01-06 03:35

    There was an answer to this in the apache kafka mail archives. I am copying it below:

    The consumer supports a configuration option "metadata.max.age.ms" which basically controls how often topic metadata is fetched. By default, this is set fairly high (5 minutes), which means it will take up to 5 minutes to discover new topics matching your regular expression. You can set this lower to discover topics quicker.

    So in your props you can:

    props.put("metadata.max.age.ms", 5000);
    

    This will cause your consumer to find out about new topics every 5 seconds.

    0 讨论(0)
提交回复
热议问题