记录一个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());
}
}
}
}