Apache kafka 使用Gatling在文件中逐行循环,并一次向Kafka发送一条消息

Apache kafka 使用Gatling在文件中逐行循环,并一次向Kafka发送一条消息,apache-kafka,gatling,Apache Kafka,Gatling,我有一个文件,其中包含类似这样的文本 {"content_type":"Twitter","id":"77f985b0-a30a-11e5-8791-80000bc51f65","source_id":"676656486307639298","date":"2015-12-15T06:54:12.000Z","text":"RT @kokodeikku_bot: ?????: ??,} {"content_type":"Twitter","id":"7837a020-a30a-11e5-879

我有一个文件,其中包含类似这样的文本

{"content_type":"Twitter","id":"77f985b0-a30a-11e5-8791-80000bc51f65","source_id":"676656486307639298","date":"2015-12-15T06:54:12.000Z","text":"RT @kokodeikku_bot: ?????: ??,}
{"content_type":"Twitter","id":"7837a020-a30a-11e5-8791-80000bc51f65","source_id":"676656494700568576",}
{"content_type":"Twitter","id":"7838d8a0-a30a-11e5-8791-80000bc51f65","source_id":"676656507266703360",}
我无法一次将每一行作为场景中卡夫卡主题的字符串来阅读,因为我无法在《加特林》中迭代场景

这是我的密码

class KafkaSimulation extends Simulation {

   val line = Source.fromFile(<passing locn of file>)("UTF-8").getLines.mkString("\n") // one way by reading source from file

   val br = new BufferedReader(new FileReader("<passing locn of file>"))
   var line:String = ""

   while ({ line = br.readLine() ; line != null } ) {
       //In this while loop i can print line by line but i cant use while loop within scenario below  
        println(listOfLines.mkString("\n"))      
        }

  val kafkaConf = kafka

    // Kafka topic name
    .topic("test")
    // Kafka producer configs
    .properties(
      Map(
        ProducerConfig.ACKS_CONFIG -> "1",
        // list of Kafka broker hostname and port pairs
          ProducerConfig.BOOTSTRAP_SERVERS_CONFIG -> "localhost:9092",
       // Required since Apache Kafka 0.8.2.0
        ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG ->
          "org.apache.kafka.common.serialization.ByteArraySerializer",
        ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG ->
          "org.apache.kafka.common.serialization.ByteArraySerializer"))

     val scn = scenario("Kafka Test")
    .exec(kafka("request") 
       // message to send 
       .send(line.toString())) //Here if i put line.toString(), it doesnt read line by line instead it will post entire 3 lines as one message

  setUp(
      scn.inject(constantUsersPerSec(10) during (1 seconds)))
     .protocols(kafkaConf)

}
KafkaSimulation类扩展了模拟{
val line=Source.fromFile()
val br=新的BufferedReader(新的文件读取器(“”))
变量行:String=“”
而({line=br.readLine();line!=null}){
//在这个while循环中,我可以逐行打印,但我不能在下面的场景中使用while循环
println(listOfLines.mkString(“\n”))
}
瓦尔·卡夫卡诺夫=卡夫卡
//卡夫卡主题名
.主题(“测试”)
//卡夫卡制作人配置
.物业(
地图(
ProducerConfig.ACKS_CONFIG->“1”,
//Kafka代理主机名和端口对列表
ProducerConfig.BOOTSTRAP\u SERVERS\u CONFIG->“localhost:9092”,
//自Apache Kafka 0.8.2.0以来需要
ProducerConfig.KEY\u序列化程序\u类\u配置->
“org.apache.kafka.common.serialization.ByteArraySerializer”,
ProducerConfig.VALUE\u序列化程序\u类\u配置->
“org.apache.kafka.common.serialization.ByteArraySerializer”))
val scn=场景(“卡夫卡测试”)
.exec(卡夫卡(“请求”)
//要发送的消息
.send(line.toString())//如果我在这里放置line.toString(),它不会逐行读取,而是将整个3行作为一条消息发布
设置(
scn.注入(在(1秒)内注入康斯坦特斯(10))
.议定书(卡夫卡诺夫)
}

关于如何在场景中迭代文件并逐行读取的技巧

将您的文件转换为一列CSV Feeder,并使用标准的Gatling方式:输入一条记录,发送您的请求,然后重复您想要的内容。

为了实现此目标,您真正需要的唯一一件事是打开文件并逐行迭代@stephane的评论有点生硬,但他的意思是:

Source
  .fromFile("files/yourtargetfile.txt")
  .getLines
  .map { line =>
    //do your stuff  
  }.foreach(println)
或者,如果您不想编辑文件的内容,可以使用更简单的方法:

Source
  .fromFile("files/ChargeNames")
  .getLines
  .foreach { line =>
    //do your stuff 
  }
我希望这有帮助,
干杯。

感谢Stephane的快速回复。它现在可以工作了,但是在Apache Kafka上发布的行中有一个问题,它将大括号中的第一个双引号修剪为{content_type]:而不是作为{“content_type”发送:可能是我使用的文件有一些编码问题。但是许多thanksA Feeder只是一个迭代器[Map[String,Any]]。您可以使用Source.getLines轻松解析文件,并将这些行映射为一个带有单个条目的映射。