Kafka Java Consumer SDK长时不使用while

时间:2018-08-13 03:30:18

标签: java apache-kafka

我尝试使用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();
        }

我想知道是否有任何优雅的方法可以在不使用while循环的情况下进行处理,这类似于以下RabbitMQ的实现:

Consumer consumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
          throws IOException {
        String message = new String(body, "UTF-8");
        System.out.println(" [x] Received '" + message + "'");
      }
    };
    channel.basicConsume(QUEUE_NAME, true, consumer);

2 个答案:

答案 0 :(得分:1)

您可以尝试使用带有Spring-kafka批注的@KafkaListener,并使该方法可以监听主题,以获取更多信息here

因为在apache-kafka中,没有一种使方法成为主题侦听器的优雅方法,因为消费者需要轮询特定间隔的记录,因此需要循环编码

@KafkaListener(topics = "topicName", group = "foo")
public void listen(String message) {
System.out.println("Received Messasge in group foo: " + message);
}

答案 1 :(得分:0)

轮询循环是在Kafka中使用消息的唯一方法。处理消息的优美代码应该在循环内。