Apache kafka 卡夫卡消费者民意调查无限期地进行,并且没有';我什么也不退

Apache kafka 卡夫卡消费者民意调查无限期地进行,并且没有';我什么也不退,apache-kafka,kafka-consumer-api,producer-consumer,consumer,Apache Kafka,Kafka Consumer Api,Producer Consumer,Consumer,我在KafkaConsumer.poll(durationtimeout)方面遇到了困难,它无限期地运行,并且永远不会从方法中出现。理解这可能与连接有关,我有时看到它有点不一致。如果轮询停止响应,我如何处理此问题?下面是KafkaConsumer.poll()的片段 public ConsumerRecords轮询(最终持续时间超时){ 返回轮询(time.timer(超时),true); } 我从这里给上面打电话: Duration timeout = Duration.ofSeconds(

我在KafkaConsumer.poll(durationtimeout)方面遇到了困难,它无限期地运行,并且永远不会从方法中出现。理解这可能与连接有关,我有时看到它有点不一致。如果轮询停止响应,我如何处理此问题?下面是KafkaConsumer.poll()的片段

public ConsumerRecords轮询(最终持续时间超时){
返回轮询(time.timer(超时),true);
}
我从这里给上面打电话:

Duration timeout = Duration.ofSeconds(30);
    while (true) {
        final ConsumerRecords<recordID, topicName> records = consumer.poll(timeout);
        System.out.println("record count is" + records.count());
}
持续时间超时=持续时间秒(30);
while(true){
最终消费者记录记录=消费者轮询(超时);
System.out.println(“记录计数为”+records.count());
}
我得到以下错误:

org.apache.kafka.common.errors.SerializationException:错误 反序列化偏移量2处分区的键/值。如果 如有需要,请查看记录以继续消费


我在试图解决上述问题时偶然发现了一些有用的信息。我将提供一段代码,它应该能够处理这一点,但在此之前,重要的是要知道这是什么原因造成的

在向ApacheKafka生成或使用消息或数据时,我们需要该消息或数据的模式结构,在我的例子中是Avro模式。如果向卡夫卡生成的消息与该消息模式冲突,则会对消费产生影响

在使用者主题中使用记录的方法中添加以下代码--

请记住导入以下软件包:

导入org.apache.kafka.common.TopicPartition
导入org.jsoup.SerializationException

试试看{
while(true){
ConsumerRecords记录=null;
试一试{
记录=消费者调查(10000);
}捕获(序列化异常){
字符串s=e.getMessage().split(“反序列化键/值时出错
对于分区“[1]”。拆分(“。如果需要,请通过记录查找到
继续消费。”)[0];
字符串主题=s.split(“-”[0];
int offset=Integer.valueOf(s.split(“offset”)[1]);
int partition=Integer.valueOf(s.split(“-”)[1]。split(“at”)。
[0]);
TopicPartition TopicPartition=新的TopicPartition(主题,
分割);
//log.info(“跳过”+主题+“-”+分区+“偏移量”
+抵消);
consumer.seek(主题分区,偏移量+1);
}
对于(消费者记录:记录){
System.out.printf(“value=%s\n”,record.value());
}
}
}最后{
consumer.close();
}

如果它确实从未返回,您是否可以获取线程转储并查看线程的位置?请显示我在上面添加的消费者属性、线程转储和错误
Duration timeout = Duration.ofSeconds(30);
    while (true) {
        final ConsumerRecords<recordID, topicName> records = consumer.poll(timeout);
        System.out.println("record count is" + records.count());
}
try {
        while (true) {
            ConsumerRecords<String, GenericRecord> records = null;
            try {
                records = consumer.poll(10000);
            } catch (SerializationException e) {
                String s = e.getMessage().split("Error deserializing key/value 
for partition ")[1].split(". If needed, please seek past the record to 
continue consumption.")[0];
                String topics = s.split("-")[0];
                int offset = Integer.valueOf(s.split("offset ")[1]);
                int partition = Integer.valueOf(s.split("-")[1].split(" at") . 
   [0]);

                TopicPartition topicPartition = new TopicPartition(topics, 
 partition);
                //log.info("Skipping " + topic + "-" + partition + " offset " 
 + offset);
                consumer.seek(topicPartition, offset + 1);
            }


            for (ConsumerRecord<String, GenericRecord> record : records) {

                System.out.printf("value = %s \n", record.value());


            }

        }


    } finally {
        consumer.close();
    }