Java Kafka Consumer可以很好地使用新的Consumer组ID,但在关闭和重新启动时,它不会使用任何消息

Java Kafka Consumer可以很好地使用新的Consumer组ID,但在关闭和重新启动时,它不会使用任何消息,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,这可能是我缺乏理解,但令人沮丧。我有一个javakafka消费者,当它被分配一个新创建的groupId和consumerID时,它会很好地消费消息。但是,在我的EclipseIDE中停止java应用程序并使用相同的groupID和consumerID重新启动它时,它不会提取任何消息。如果我再次关闭应用程序,并为其分配新的和不同的groupID/consumerID,它就可以正常工作。有人能帮我弄清楚为什么会这样吗 下面是配置值 props.put("bootstrap.servers","192

这可能是我缺乏理解,但令人沮丧。我有一个javakafka消费者,当它被分配一个新创建的groupId和consumerID时,它会很好地消费消息。但是,在我的EclipseIDE中停止java应用程序并使用相同的groupID和consumerID重新启动它时,它不会提取任何消息。如果我再次关闭应用程序,并为其分配新的和不同的groupID/consumerID,它就可以正常工作。有人能帮我弄清楚为什么会这样吗

下面是配置值

props.put("bootstrap.servers","192.168.5.0:30092,192.168.4.6:30092,192.168.5.8:30092");
props.put("acks", "all");
props.put("retries", 4);
props.put("batch.size", 1000);
props.put("linger.ms", 1);
props.put("buffer.memory", 335544323);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "Router2");
props.put(ConsumerConfig.CLIENT_ID_CONFIG, "Consumer2");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "300000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.ByteArrayDeserializer");

默认情况下,当使用者开始阅读消息时,它会提交已成功使用的消息的偏移量,以便不再使用它们

每次创建新的消费者组时,消费者将从最早的可用偏移开始消费(因为之前没有为新创建的消费者组提交偏移)

使用者从协调器接收其分配后,它 必须确定每个分配分区的初始位置。什么时候 在使用任何消息之前,首先创建组, 根据可配置的偏移重置策略设置位置 (
auto.offset.reset
)。通常,消费从两个阶段开始 最早偏移量或最新偏移量

有关更多详细信息,请参阅合并文档中的


如果您想实现相同的行为,只需坚持使用相同的消费者组,并将
自动偏移。重置
最早
,而不是
最晚
,这是默认值:

props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

(取决于当前运行的版本)

这样,您的消费者将始终从最早的可用偏移量开始使用消息

或者,您也可以使用
查看tobegining()

kafkaConsumer.poll(0);//心跳发送
kafkaConsumer.seektobegining(kafkaConsumer.assignment());
消费者记录=kafkaConsumer.poll(5);


请注意,这与可与卡夫卡控制台使用者一起使用的
--from start
标志具有相同的效果

是的,我可以通过查看仪表板和消息发布度量来确认这一点。大约每秒100条消息。我尝试添加props.put(ConsumerConfig.AUTO\u OFFSET\u RESET\u CONFIG,“最早”);对于我的配置,但同样的行为,没有消息被提取,我知道另一个应用程序不断生成主题消息。我也理解--从一开始,但我认为这需要分区分配。assignPartitions和topicSubscribe之间是否存在差异?@DuncanKrebs查看我的更新答案。再尝试一种方法,让我know@DuncanKrebs另外,出于好奇,你可以尝试一下props.put(“auto.offset.reset”,“miniment”)删除消费者组属性并设置此props.put(ConsumerConfig.AUTO\u OFFSET\u RESET\u CONFIG,“latest”)时,我可以使用相同的消费者ID启动/重新启动消费者,并且它每次都继续提取消息。@DuncanKrebs即使您删除
props.put(ConsumerConfig.AUTO\u OFFSET\u RESET\u CONFIG,“最新”)
因为如果您不提供组id,将为您的消费者生成一个随机组id。
props.put("auto.offset.reset", "smallest")
kafkaConsumer.poll(0); // Heartbeat sent
kafkaConsumer.seekToBeginning(kafkaConsumer.assignment());
ConsumerRecords<String, String> records = kafkaConsumer.poll(5);