为什么在Kafka中消费消息时不会更新偏移量

时间:2017-03-09 17:07:54

标签: java apache-kafka kafka-consumer-api

我正在实施Kafka消费者类来接收消息。我想每次只收到新消息。因此,我设置enable.auto.commit为真。然而,抵消似乎根本没有变化。即使主题,消费者组和分区始终相同。

这是我的消费者代码:

    consumerConfig.put("bootstrap.servers", bootstrap);
    consumerConfig.put("group.id", KafkaTestConstants.KAFKA_GROUP);
    consumerConfig.put("enable.auto.commit", "true");
    consumerConfig.put("auto.offset.reset", "earliest");
    consumerConfig.put("auto.commit.interval", 1000);
    consumerConfig.put("key.deserializer", StringDeserializer.class.getName());
    consumerConfig.put("value.deserializer", StringDeserializer.class.getName());
    StringDeserializer deserializer = new StringDeserializer();
    KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(consumerConfig, deserializer, deserializer);

    TopicPartition tp = new TopicPartition(KafkaTestConstants.KAFKA_TOPIC, 0);
    List<TopicPartition> tps = Arrays.asList(tp);
    kafkaConsumer.assign(tps);
    long offset = kafkaConsumer.position(tp);
    System.out.println("Offset of partition: " + offset);

    List<String> messages = new ArrayList<String>();
    ConsumerRecords<String, String> records = kafkaConsumer.poll(100);

    for (ConsumerRecord<String, String> record : records) {
        System.out.println("Message received: " + record.value());
        messages.add(record.value());
    }

    consumer.commitAsync();
    System.out.println("Offset commited.\n");
    consumer.close();

无论我运行多少次,它总是显示偏移量为0.因此,它始终从一开始就接收所有消息。我错过了什么?

编辑:根据Matthias的回答,我决定手动提交偏移量。但是commitSync()会挂起。 commitAsync()有点作品。我将解释&#34;&#34;&#34;&#34;后来。以下是代码的作用:

producer send 2 messages;
consumer initiates;
print out current position;
consumer.poll();
print received messages;
consumer.commitAsync();

这是代码的行为方式。说我有100条消息。现在,制作人发送2条新消息。在消费者轮询之前,它会将当前偏移位置显示为102,假设为100.因此,不会打印出新消息。它几乎就像生产者发送消息后更新偏移量一样。

1 个答案:

答案 0 :(得分:1)

自动提交仅在您使用使用者群组管理时才有效,为此,您需要“订阅”某个主题,但不能手动“分配”分区。

比较KafkaConsumer的JavaDoc。这是一个很长的阅读,但需要了解有关如何正确使用消费者的细微细节:https://kafka.apache.org/0102/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html

此外,如果启用了自动提交,它将在poll内提交(即,对poll()的调用可能会提交从先前调用poll()返回的消息)而不是当你遍历返回消息时。这也意味着,您的提交将“跳转”,例如从提交的偏移0到100(如果您通过轮询收到100个消息的单个分区)。