我正在尝试让一个简单的Kafka Consumer使用Java API v0.9.0.1来工作.我正在使用的kafka服务器是一个docker容器,也运行0.9.0.1版.以下是消费者代码:
public class Consumer {
public static void main(String[] args) throws IOException {
KafkaConsumer consumer;
try (InputStream props = Resources.getResource("consumer.props").openStream()) {
Properties properties = new Properties();
properties.load(props);
consumer = new KafkaConsumer<>(properties);
}
consumer.subscribe(Arrays.asList("messages"));
try {
while (true) {
ConsumerRecords records = consumer.poll(100);
for (ConsumerRecord record : records)
System.out.println("Message received: " + record.value());
}
}catch(WakeupException ex){
System.out.println("Exception caught " + ex.getMessage());
}finally{
consumer.close();
System.out.println("After closing KafkaConsumer");
}
}
}
但是,启动使用者时,它将调用上面的poll(100)方法,并且永不返回.进行调试,似乎永远无法在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient中运行以下方法:
public void awaitMetadataUpdate() {
int version = this.metadata.requestUpdate();
do {
this.poll(9223372036854775807L);
} while(this.metadata.version() == version);
}
(这两个版本和this.metadata.version()始终总是== 2).另外,尽管它没有引发任何错误,但是我的Java生产者发出的消息从未出现在队列中.我已经验证了使用命令行kafka工具,我可以从队列发送和接收消息.
任何人都知道这是怎么回事吗?