Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kafka Java Consumer SDK无需使用while即可长拉_Java_Apache Kafka - Fatal编程技术网

Kafka Java Consumer SDK无需使用while即可长拉

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) {

我尝试使用Kafka Java SDK来实现消费者,但是我看到的大多数消费者示例都使用
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);
}