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轻松解析文件,并将这些行映射为一个带有单个条目的映射。