我试图通过一个无业游民的机器使用Apache Kafka运行一个简单的Kafka Consumer程序。尝试调用.poll(100)方法时,该程序被卡在for循环之前。
很多事情都在深入研究调试类,但没有发现很多。
val TOPIC="testTopic"
val props = new Properties()
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.56.10:9092")
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest")
props.put(ConsumerConfig.GROUP_ID_CONFIG, UUID.randomUUID().toString());
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
val consumer = new KafkaConsumer[String, String](props)
consumer.subscribe(util.Collections.singletonList(TOPIC))
while(true) {
println("Test")
val records = consumer.poll(100)
for (record <- records.asScala) {
println(record)
}
println("Test2")
}
}
当前输出Test,然后卡住,没有错误消息。预计它将输出Kafka主题的内容。
答案 0 :(得分:0)
您需要升级您的 kafka客户端版本至2.0.0或更高版本。例如,当kafka服务器关闭时,使用KafkaConsumer
类中的poll方法,您将卡在内部循环中,等待代理再次可用。
根据KIP-266:
ConsumerRecords
投票(长时间超时)
已弃用。从2.0开始。 使用民意测验(持续时间),该测验不会阻止 超过超时等待分区分配。有关更多信息,请参见KIP-266 信息。
在您的情况下:
import org.apache.kafka.clients.consumer.KafkaConsumer;
import scala.concurrent.duration._
// ...
val timeout = Duration(100, MILLISECONDS)
while(true) {
println("Test")
val records = consumer.poll(timeout)
for (record <- records.asScala) {
println(record)
}
println("Test2")
}
//...
最后,您只需要导入KafkaConsumer
类的新版本,并将timeout参数作为Duration
对象的实例传递给新的poll方法。