Apache kafka使用者停止和启动之间丢失的消息

时间:2018-07-31 21:23:43

标签: apache-kafka kafka-consumer-api

我是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);   
            }
        }   

1 个答案:

答案 0 :(得分:0)

由于禁用了自动提交,因此必须显式调用Consumer.commitSync()或Consumer.commitAsync()。您可以根据需要/首选的方式同步执行或不同步执行提交。这就是消费组在日志中的位置将被保留的方式。您应该在处理记录之后(因此可能在完成所有插入之后但在再次查询之前)调用commit。