我是kafka的新手,他使用Apache kafka使用者读取生产者的消息。但是当我停下来并开始一定时间时。之间的所有产生的消息都将丢失。如何处理这种情况。我正在使用以下属性“ auto.offset.reset”,“最新”和“ enable.auto.commit”,“ false”。
这是我正在使用的代码。感谢您的帮助。
Properties props = new Properties();
props.put("bootstrap.servers", localhost:9092);
props.put("group.id", "service");
props.put("enable.auto.commit", "false");
props.put("auto.offset.reset", "latest");
props.put("key.deserializer", KAFKA_DESERIALIER_STRING_KEYVALUE);
props.put("value.deserializer", KAFKA_DESERIALIER_STRING_KEYVALUE);
@SuppressWarnings("resource")
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
consumer.subscribe(Arrays.asList(topicname));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
JSONObject jsonObj = new JSONObject(record.value());
JdbcUtilToUdm.insertdataintodb(args, jsonObj);
}
}
答案 0 :(得分:0)
由于禁用了自动提交,因此必须显式调用Consumer.commitSync()或Consumer.commitAsync()。您可以根据需要/首选的方式同步执行或不同步执行提交。这就是消费组在日志中的位置将被保留的方式。您应该在处理记录之后(因此可能在完成所有插入之后但在再次查询之前)调用commit。