Kafka Java API 消费者无法消费数据

1,993 阅读1分钟

记录一个Kafka Java API 无法消费 Kafka消息的问题。

问题描述:

搭了一个Kafka集群,然后使用 Kafka Java API 写了一个生产者测试类,还有一个消费者测试类。生产者向Kafka发送消息没有一点问题,但是消费者消费不到Kafka的消息,但是却有offset记录。

解决办法:

将Zookeeper中的Kafka元数据都删除掉,就是Zookeeper节点中那个Broker的节点。删掉之后消费者就可以消费到数据了。

上代码

生产者代码:

package co.agilor.data_enter.kafka;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;

public class KafkaProduceTest {
    public static void main(String[] args) {

        //1.1: 配置生产者相关信息
        Properties props = new Properties();
        props.put("bootstrap.servers", "node1:9092,node2:9092,node3:9092"); // 指定kafka服务地址
        props.put("acks", "all"); // 校验机制  主要目的是为了保证消息不丢失
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // 指定 key的序列化类型
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // 指定 value的序列化类型

        //1. 创建kafkaProducer 生产者核心类对象:  指定生产者配置信息
        Producer<String, String> producer = new KafkaProducer<>(props);
        for (int i = 1; i <= 100; i++) {
            //2. 发送数据操作
            // ProducerRecord : 生产者数据传递的承载类
            ProducerRecord<String, String> producerRecord = new ProducerRecord<>("test02",  Integer.toString(i));
            producer.send(producerRecord);
        }
        //3. 释放资源
        producer.close();

    }
}

消费者代码:

package co.agilor.data_enter.kafka;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;

public class KafkaConsumerTest {
    public static void main(String[] args) {
        //1.1: 指定kafka消费者的配置信息
        Properties props = new Properties();
        props.setProperty("bootstrap.servers", "node1:9092,node2:9092,node3:9092"); // kafka的连接地址
        props.setProperty("group.id", "test"); // 消费组 ID
        props.setProperty("enable.auto.commit", "true"); // 是否启动自动提交消者偏移量
        props.setProperty("auto.commit.interval.ms", "1000"); //  每间隔多长时间提交一次偏移量信息
        props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); // 指定反序列化的key类型
        props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");// 指定反序列化的value类型


        //1. 创建 kafka的消费者核心类对象 KafkaConsumer , 并指定其消费者配置信息
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);

        //2. 指定消费者要监听那些topic
        consumer.subscribe(Arrays.asList("test02"));
        while (true) {
            //3. 获取数据:
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));

            for (ConsumerRecord<String, String> record : records) {
                //System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
                System.out.println("从哪个分片中获取数据: "+record.partition() +";获取数据: "+record.value());
            }
        }

    }
}