我有一位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但没有成功。有什么想法吗?
答案 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(也可以批量生成,以获得性能增益),如果您在处理多个线程中的消息时手动执行此操作,则会出现容易出错的情况。