Java KakaConsumer.poll(超时)和KafkaConsumer.poll(持续时间为0)之间的差异

Java KakaConsumer.poll(超时)和KafkaConsumer.poll(持续时间为0)之间的差异,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我从一开始就在读卡夫卡的主题。为了使用seektobegining()我首先需要对poll()进行一个伪调用。以下是我的代码片段: // Subscribe consumer.subscribe(Collections.singleton(TOPIC_NAME)); // Seek to beginning // consumer.poll(Duration.ZERO); consumer.poll(0); consumer.seekToBegin

我从一开始就在读卡夫卡的主题。为了使用
seektobegining()
我首先需要对poll()进行一个伪调用。以下是我的代码片段:

    // Subscribe
    consumer.subscribe(Collections.singleton(TOPIC_NAME));
    // Seek to beginning
    // consumer.poll(Duration.ZERO);
    consumer.poll(0);
    consumer.seekToBeginning(Collections.singleton(new TopicPartition(TOPIC_NAME, 0)));
使用
consumer.poll(0)
效果很好。当我使用
consumer.poll(Duration.ZERO)
时,会导致以下异常:

[main] INFO org.apache.kafka.clients.consumer.internals.SubscriptionState - [Consumer clientId=consumer-group2-1, groupId=group2] Seeking to EARLIEST offset of partition test-lc-1-0
Exception in thread "main" java.lang.IllegalStateException: No current assignment for partition test-lc-1-0
    at org.apache.kafka.clients.consumer.internals.SubscriptionState.assignedState(SubscriptionState.java:368)
    at org.apache.kafka.clients.consumer.internals.SubscriptionState.lambda$requestOffsetReset$3(SubscriptionState.java:615)
    at java.base/java.util.Collections$SingletonSet.forEach(Collections.java:4797)
    at org.apache.kafka.clients.consumer.internals.SubscriptionState.requestOffsetReset(SubscriptionState.java:613)
    at org.apache.kafka.clients.consumer.KafkaConsumer.seekToBeginning(KafkaConsumer.java:1659)
    at com.ahmed.ConsumeProtobuf.main(ConsumeProtobuf.java:49)
我研究了这两个API的实现。最后,两个api都以
0
作为参数调用相同的方法。知道为什么轮询(Duration.ZERO)会失败吗

谢谢,,
Ahmed.

启动消费者时,正确的方法是使用
ConsumerBalanceListener

例如,类似于:

try(卡夫卡消费者=新卡夫卡消费者(配置);){
consumer.subscribe(Collections.singleton(主题名称),new ConsumerBalanceListener(){
@凌驾
公共void onPartitionsRevoked(集合分区){}
@凌驾
已签名的分区上的公共void(集合分区){
消费者。请参见目标划分(分区);
}
});
while(true){
消费者投票(持续时间为1L);
...
}
}

启动消费者时,正确的方法是使用
消费者平衡监听器

例如,类似于:

try(卡夫卡消费者=新卡夫卡消费者(配置);){
consumer.subscribe(Collections.singleton(主题名称),new ConsumerBalanceListener(){
@凌驾
公共void onPartitionsRevoked(集合分区){}
@凌驾
已签名的分区上的公共void(集合分区){
消费者。请参见目标划分(分区);
}
});
while(true){
消费者投票(持续时间为1L);
...
}
}

Duration.ZERO与poll(0)完全相同,因此失败是因为使用者没有获取分区分配元数据,因为poll太快太超前,增加0Duration.ZERO与poll(0)完全相同,所以失败是因为使用者没有获取分区分配元数据,因为poll太快太超前,增加0