我正在使用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?
谢谢!
答案 0 :(得分:1)
没有评论:“由于我有一个UI,并且想通过单击“接收”按钮一个接一个地接收消息,因此可能会出现不再轮询的消息的情况。”
在这种情况下,每次有人单击“接收”按钮然后再将其关闭时,您都需要创建一个新的KafkaConsumer
。
如果要在客户端的整个生命周期中使用相同的KafkaConsumer,则需要让代理知道它仍然存在(通过发送心跳,这是通过调用poll方法隐式完成的)。否则,就像您已经经历的那样,经纪人会认为您的KafkaConsumer已死,并将启动重新平衡。由于没有其他活动的消费者可用,因此重新平衡不会停止。