从Kafka消费者返回价值

时间:2020-07-22 03:50:26

标签: scala apache-kafka

我正在开发一个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(),以便可以在其他方法中使用从主题获取的数据。

1 个答案:

答案 0 :(得分:0)

如果要返回,则必须按如下所示修改代码库。要取消弃用民意调查,您只需传递持续时间即可。有关更多信息,refer

def readFromKafka(//arguments) = {
 // other code

 consumer.subscribe(util.Collections.singletonList(topic))
 consumer.poll(Duration.ofMillis(5000)).asScala.toList.map(_.value())
}

要继续阅读Kafka,您必须继续调用该函数。为此,您可以使用调度程序。 希望对您有所帮助。