[英]Kafka: consume all messages on demand
目标:阅读主题中的所有消息,然后终止该过程。
我能够通过以下方式连续阅读消息:
props.put("bootstrap.servers", kafkaBootstrapSrv);
props.put("group.id", group_id);
props.put("max.poll.records", 1); // Only get one record at a time. I understand that to read all messages this will need to be increased
props.put("enable.auto.commit", "false");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("MY_TOPIC"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(500);
for (ConsumerRecord<String, String> record : records) {
process_record(record);
}
consumer.commitSync();
}
但是在这种情况下,该过程永远不会终止。 当我摆脱
while (true)
循环并运行该程序,它不会从该主题中获取一条记录(我希望有一条记录)。 这是为什么?
Kafka主题基本上实现了无数事件。
那么,何时从某个话题开始消费就停止? 你怎么知道你到达终点了? 简短的答案是你不知道! 理论上,制作人可以始终向该主题发送新信息。
在实践中,假设没有附加新记录或只有很少新记录,您可以做一些事情来结束。
使用endOffsets()
可以找到分区的当前最近偏移量。 使用方达到分配给它的所有分区的偏移量后,就可以停止轮询(或刷新它,并查看是否已发送新消息)。
您可以使用position()
方法检索每个分区中的当前位置。 使用时,每个记录还通过offset()
公开其自己的偏移offset()
。 因此,您可以使用这些来跟踪到终点偏移的进度。
关于第二个关于poll()
问题,它在第一次调用时不返回任何内容。 这是可以预期的,因为基本上poll()
使客户端能够工作,并且在第一次调用时,它将启动与群集的连接并启动组协议(这需要几秒钟),因此在poll()
之前不太可能已经收到消息poll()
返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.