我正在开发一个scala应用程序。我在其中使用kafka。我要消费来自kafka主题的消息。由于我正在编写一个测试用例,因此我需要获取记录并做一些断言才能通过我的测试用例。我正在使用以下代码来消耗kafka消息:
import java.util.{Collections, Properties}
import java.util.regex.Pattern
import org.apache.kafka.clients.consumer.KafkaConsumer
import scala.collection.JavaConverters._
object KafkaConsumerSubscribeApp extends App {
val props:Properties = new Properties()
props.put("group.id", "test")
props.put("bootstrap.servers","localhost:9092")
props.put("key.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer")
Props.put("value.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer")
props.put("enable.auto.commit", "true")
props.put("auto.commit.interval.ms", "1000")
val consumer = new KafkaConsumer(props)
val topics = List("topic_text")
try {
consumer.subscribe(topics.asJava)
while (true) {
val records = consumer.poll(10)
for (record <- records.asScala) {
println("Topic: " + record.topic() +
",Key: " + record.key() +
",Value: " + record.value() +
", Offset: " + record.offset() +
", Partition: " + record.partition())
}
}
}catch{
case e:Exception => e.printStackTrace()
}finally {
consumer.close()
}
}
此代码面临两个问题。在intellij中,警告不赞成使用轮询方法。如何修改此代码以弃用?第二个问题是我想要此方法返回从kafka主题获取的消息。该消息在record.value()中。我该如何退货?有了这段代码,因为使用了while(true),所以它将是一个无休止的循环,它将继续监听来自主题的消息。如何从此方法返回record.value(),以便可以在其他方法中使用从主题获取的数据。
答案 0 :(得分:0)
如果要返回,则必须按如下所示修改代码库。要取消弃用民意调查,您只需传递持续时间即可。有关更多信息,refer
def readFromKafka(//arguments) = {
// other code
consumer.subscribe(util.Collections.singletonList(topic))
consumer.poll(Duration.ofMillis(5000)).asScala.toList.map(_.value())
}
要继续阅读Kafka,您必须继续调用该函数。为此,您可以使用调度程序。 希望对您有所帮助。