Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 卡夫卡消费者在重新启动时读取最后提交的偏移量(Java)_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Apache kafka 卡夫卡消费者在重新启动时读取最后提交的偏移量(Java)

Apache kafka 卡夫卡消费者在重新启动时读取最后提交的偏移量(Java),apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我有一个kakfa使用者,其enable.auto.commit设置为false。每当我重新启动消费者应用程序时,它总是再次读取上一个提交的偏移量,然后读取下一个偏移量 例如,上次提交的偏移量为50。当我重新启动消费者时,它再次首先读取偏移量50,然后读取下一个偏移量 我正在执行commitsync,如下所示 Map<TopicPartition, OffsetAndMetadata> offsets = new HashMap<>(); offsets.put(new

我有一个kakfa使用者,其enable.auto.commit设置为false。每当我重新启动消费者应用程序时,它总是再次读取上一个提交的偏移量,然后读取下一个偏移量

例如,上次提交的偏移量为50。当我重新启动消费者时,它再次首先读取偏移量50,然后读取下一个偏移量

我正在执行commitsync,如下所示

Map<TopicPartition, OffsetAndMetadata> offsets = new HashMap<>();
offsets.put(new TopicPartition("sometopic", partition), new OffsetAndMetadata(offset));
kafkaconsumer.commitSync(offsets);

看起来您正试图使用
newoffsetandmetadta(offset)
提交。这不是典型的用法

以下是文档中手动偏移控制下的示例:

List buffer=new ArrayList();
while(true){
ConsumerRecords记录=consumer.poll(100);
对于(消费者记录:记录){
buffer.add(记录);
}
if(buffer.size()>=minBatchSize){
insertIntoDb(缓冲区);
consumer.commitSync();
buffer.clear();
}
}


注意
consumer.commitSync()
调用是如何在没有任何参数的情况下执行的。它只是消耗,并且它将提交到该点之前消耗的任何内容。

如果要使用
commitSync(offset)
,您必须小心阅读其:

提交的偏移量应该是应用程序将使用的下一条消息,即lastProcessedMessageOffset+1


如果不将+1添加到偏移量,则预期在下次重新启动时,使用者将再次使用最后一条消息。正如在另一个答案中提到的,如果您在没有任何参数的情况下使用
commitSync()
,您就不必担心

这会提交所有内容,并且您无法处理更精细的偏移量提交,例如,如果我读取10条消息并处理第6条消息时抛出异常。。也许我想提交到相对于第5条消息的偏移量,这样我就不会多次处理相同的消息
config.put(ConsumerConfig.CLIENT_ID_CONFIG, "CLIENT_ID");
config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
config.put(ConsumerConfig.GROUP_ID_CONFIG, "GROUP_ID");
config.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");
config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName());
config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,CustomDeserializer.class.getName());
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
 List<ConsumerRecord<String, String>> buffer = new ArrayList<>();
 while (true) {
     ConsumerRecords<String, String> records = consumer.poll(100);
     for (ConsumerRecord<String, String> record : records) {
         buffer.add(record);
     }
     if (buffer.size() >= minBatchSize) {
         insertIntoDb(buffer);
         consumer.commitSync();
         buffer.clear();
     }
 }