检查Kafka Consumer是否没有任何记录要返回并且在Java中为空的好方法?

时间:2020-10-14 15:51:48

标签: java apache-kafka kafka-consumer-api

我正在使用Apache KafkaConsumer。我想检查使用者是否有任何消息无需轮询即可返回。如果我轮询使用者并且没有任何消息,那么即使我有一个records.isEmpty()子句,我也会无限循环地收到消息“由于组正在重新平衡而导致心跳失败”,直到超时为止。这是我的代码的一部分:

ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(10));
if (records.isEmpty()) {
      log.info("No More Records");
      consumer.close();
    }
else {
      records.iterator().forEachRemaining(record -> log.info("RECORD: " + record);
);

这很好,直到records为空为止。一旦为空,它将多次记录“由于组正在重新平衡而导致心跳失败”,多次记录“没有更多记录”,然后继续记录心跳错误。我该如何应对呢?如何优雅地检查(没有任何心跳消息)没有更多要轮询的记录?

编辑:我问了另一个问题,完整的代码和上下文位于此链接上:How to get messages from Kafka Consumer one by one in java?

谢谢!

1 个答案:

答案 0 :(得分:1)

没有评论:“由于我有一个UI,并且想通过单击“接收”按钮一个接一个地接收消息,因此可能会出现不再轮询的消息的情况。”

在这种情况下,每次有人单击“接收”按钮然后再将其关闭时,您都需要创建一个新的KafkaConsumer

如果要在客户端的整个生命周期中使用相同的KafkaConsumer,则需要让代理知道它仍然存在(通过发送心跳,这是通过调用poll方法隐式完成的)。否则,就像您已经经历的那样,经纪人会认为您的KafkaConsumer已死,并将启动重新平衡。由于没有其他活动的消费者可用,因此重新平衡不会停止。