Kafka Java Consumer SDK无需使用while即可长拉
我尝试使用Kafka Java SDK来实现消费者,但是我看到的大多数消费者示例都使用Kafka Java Consumer SDK无需使用while即可长拉,java,apache-kafka,Java,Apache Kafka,我尝试使用Kafka Java SDK来实现消费者,但是我看到的大多数消费者示例都使用while(true)循环和循环内调用consume方法来获取消息 while (true) { final ConsumerRecords<Long, String> consumerRecords = consumer.poll(1000); if (consumerRecords.count()==0) {
while(true)
循环和循环内调用consume
方法来获取消息
while (true) {
final ConsumerRecords<Long, String> consumerRecords =
consumer.poll(1000);
if (consumerRecords.count()==0) {
noRecordsCount++;
if (noRecordsCount > giveUp) break;
else continue;
}
consumerRecords.forEach(record -> {
System.out.printf("Consumer Record:(%d, %s, %d, %d)\n",
record.key(), record.value(),
record.partition(), record.offset());
});
consumer.commitAsync();
}
轮询循环是使用卡夫卡中消息的唯一方法。处理消息的优雅代码应该在循环中。您可以尝试使用
Spring kafka
,它具有@KafkaListener
注释,并使方法成为侦听主题,以获取更多信息
因为在ApacheKafka中,并没有优雅的方法使方法成为主题的侦听器,因为消费者需要在特定的时间间隔内轮询记录,需要循环中的代码
@KafkaListener(topics = "topicName", group = "foo")
public void listen(String message) {
System.out.println("Received Messasge in group foo: " + message);
}
您可以尝试使用
Spring-kafka
库,这样您就可以在任何方法之上添加@kafkaListener
注释,您不需要它来循环。有一些库可以提供更高级别的抽象(如Spring-kafka或任何流式框架),这样您就不必亲自查看轮询循环,尽管如此,这个问题并没有要求外部库,而是要求java实现。所以我保留了我的答案。
@KafkaListener(topics = "topicName", group = "foo")
public void listen(String message) {
System.out.println("Received Messasge in group foo: " + message);
}