我正在使用Kafka JDK客户端版本0.10.2.1
。我能够向Kafka生成简单的消息,以进行“心跳”测试,但是我无法使用sdk使用来自同一主题的消息。进入Kafka CLI时,我可以使用该消息,因此,我确认该消息已经存在。这是我用来从我的Kafka服务器使用的函数以及这些道具-只有在我确实确认produce()
成功之后,我才会将产生的消息传递给该主题,如果需要,我可以稍后发布该函数:
private def consumeFromKafka(topic: String, expectedMessage: String): Boolean = {
val props: Properties = initProps("consumer")
val consumer = new KafkaConsumer[String, String](props)
consumer.subscribe(List(topic).asJava)
var readExpectedRecord = false
try {
val records = {
val firstPollRecs = consumer.poll(MAX_POLLTIME_MS)
// increase timeout and try again if nothing comes back the first time in case system is busy
if (firstPollRecs.count() == 0) firstPollRecs else {
logger.info("KafkaHeartBeat: First poll had 0 records- trying again - doubling timeout to "
+ (MAX_POLLTIME_MS * 2)/1000 + " sec.")
consumer.poll(MAX_POLLTIME_MS * 2)
}
}
records.forEach(rec => {
if (rec.value() == expectedMessage) readExpectedRecord = true
})
} catch {
case e: Throwable => //log error
} finally {
consumer.close()
}
readExpectedRecord
}
private def initProps(propsType: String): Properties = {
val prop = new Properties()
prop.put("bootstrap.servers", kafkaServer + ":" + kafkaPort)
propsType match {
case "producer" => {
prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
prop.put("acks", "1")
prop.put("producer.type", "sync")
prop.put("retries", "3")
prop.put("linger.ms", "5")
}
case "consumer" => {
prop.put("group.id", groupId)
prop.put("enable.auto.commit", "false")
prop.put("auto.commit.interval.ms", "1000")
prop.put("session.timeout.ms", "30000")
prop.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
prop.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
prop.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest")
// poll just once, should only be one record for the heartbeat
prop.put("max.poll.records", "1")
}
}
prop
}
现在,当我运行代码时,这是它在控制台中输出的内容:
13:04:21-发现协调器serverName:9092(id:2147483647
机架:空),用于组0b8947e1-eb68-4af3-ac7b-be3f7c02e76e。 13:04:23
INFO o.a.k.c.c.i.ConsumerCoordinator-撤销先前分配的
0b8947e1-eb68-4af3-ac7b-be3f7c02e76e组的分区[] 13:04:24
INFO o.a.k.c.c.i.AbstractCoordinator-(重新)加入组
0b8947e1-eb68-4af3-ac7b-be3f7c02e76e 13:04:25信息
o.a.k.c.c.i.AbstractCoordinator-成功加入论坛
0b8947e1-eb68-4af3-ac7b-be3f7c02e76e,第1代13:04:26信息
o.a.k.c.c.i.ConsumerCoordinator-设置新分配的分区
组的[HeartBeat_Topic.Service_5.2018-08-03.13_04_10.377-0]
0b8947e1-eb68-4af3-ac7b-be3f7c02e76e 13:04:27信息
c.p.p.l.util.KafkaHeartBeatUtil-KafkaHeartBeat:第一次民意调查为0
记录-再试一次-将超时时间增加一倍至60秒。
然后什么也没有,没有抛出任何错误-因此没有记录被轮询。有谁知道阻止“消费”发生的原因是什么?订阅者似乎成功了,因为我能够成功地调用listTopics和list部分。
答案 0 :(得分:1)
您的代码有错误。看来您的台词:
if (firstPollRecs.count() == 0)
应该这样说
if (firstPollRecs.count() > 0)
否则,您要传递一个空的firstPollRecs
,然后对其进行迭代,这显然不会返回任何内容。