我有一个批处理工作,每天会触发一次 . 要求是
消耗那时候Kafka主题上可用的所有消息
处理消息
如果该过程成功完成,则提交偏移量 .
目前我在while循环中poll()消息,直到ConsumerRecords.isEmpty()为真 . 当ConsumerRecords.isEmpty()为true时,我假设已经消耗了Topic上可用的所有记录 . 该应用程序维护偏移并关闭kafka消费者 .
当消息处理完成并成功完成后,我创建了一个新的KafkaConsumer并提交了应用程序维护的偏移量 .
注意我关闭最初用于读取消息的KafkaConsumer并使用另一个KafkaConsumer实例提交偏移量以避免消费者重新 balancer 异常 .
我期待主题上最多5k条消息 . 该主题已分区并复制 .
有没有更好的方法在特定时间点消费主题上的所有消息?我有什么遗失或需要照顾的吗?我不认为我需要处理消费者重新 balancer ,因为我在循环中对poll()进行轮询并在轮询完成后处理消息 .
我正在使用java kafka客户端v0.9,如果它在上面的场景中有帮助,可以更改为v0.10 .
谢谢
更新:
AtomicBoolean flag = new AtomicBoolean();
flag.set(true);
while(flag.get()) {
ConsumerRecords consumerRecords = kafkaConsumer.poll(timeout);
if(consumerRecords.isEmpty()) {
flag.set(false);
continue;
}
//if the ConsumerRecords is not empty process the messages and continue to poll()
}
kafkaConsumer.close();