实施自定义Kafka Consumer

时间:2018-03-11 19:57:24

标签: java apache-kafka

我有一位kafka消费者,他接收有关该主题的最新消息。代码如下:

topic = my_topic;
KafkaConsumer.subscribe(Collections.singleton(topic));
try {
        while (true) {
            ConsumerRecords<String, String> consumerRecords = KafkaConsumer.poll(10);
            for(ConsumerRecord<String, String> consumerRecord : consumerRecords){
                LOGGER.info("proceess mesage received from kafka topic=" + topic);
                System.out.println(consumerRecord.value());
            }
        }
    }catch (Exception e){
        throw new KafkaException(e.getMessage());
    }

因此,我想摆脱while循环并实现这样的包装:

customConsumer((x) - > {
    System.out.println("I have received " + x + "from kafka topic");
});
//run code 

每次发布​​消息时,customConsumer方法都会知道新消息,此方法将每次在kafka主题上进行侦听。我尝试过ExecutorService但没有成功。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解了这个问题,但这里有:

void customConsumer(java.util.function.Consumer<ConsumerRecord<String, String>> consumer) {
    KafkaConsumer.subscribe(Collections.singleton(topic));
    try {
        while (true) {
            ConsumerRecords<String, String> consumerRecords = KafkaConsumer.poll(10);
            for(ConsumerRecord<String, String> consumerRecord : consumerRecords){
                consumer.accept(consumerRecord);
            }
        }
    } catch (Exception e){
        throw new KafkaException(e.getMessage());
    }
}

然后你可以像你描述的那样调用这个方法:

customConsumer(x -> {
    System.out.println("I have received " + x + " from kafka topic");
});

如果要与消息处理并行执行某些操作,或者如果要在多个线程中同时处理消息,则只需要和ExecutorService等。如果是这样,我建议您使用.mapAsync()查看akka-stream-kafka及其示例。它们还可以很容易地执行诸如正确地将偏移量提交回kafka(也可以批量生成,以获得性能增益),如果您在处理多个线程中的消息时手动执行此操作,则会出现容易出错的情况。