Gatling多虚拟用户复用CSV Feeder遇空行崩溃问题求助
问题根源
你当前的feederRound_1是全局共享的迭代器,所有虚拟用户会共同消耗这份CSV里的记录。当用户量提升到2时,两个用户同时取数会快速耗尽713条记录,导致后续feed操作触发"feeder为空"的崩溃。要实现每个用户独立处理全量CSV,核心是让每个虚拟用户拥有专属的feeder实例。
解决方案
以下两种方案都能实现需求,根据你的代码习惯选择:
方案1:基于Session存储专属Feeder迭代器
移除全局feeder变量,让每个用户在流程初始化时创建自己的shuffle后feeder,存在Session中供后续重复调用:
// 移除全局的feederRound_1定义 def Submission_round1(): ChainBuilder = pause(pauseBy(5) seconds) // 每个用户初始化自己的专属feeder迭代器 .exec(session => { val userFeeder = csv("data/data-1.csv").shuffle.iterator session.set("userFeeder", userFeeder) }) .exec(Submission(713)) private def Submission(noOfRuns: Int): ChainBuilder = pause(pauseBy(5) seconds) .repeat(noOfRuns) { // 从当前用户的Session中获取专属feeder取数 feed(session => session("userFeeder").as[Iterator[Map[String, String]]]) .exec(postToUri(s"${config.baseUrl}/base-orders/order", s"Submit orders for : #{$orderId}") .queryParam("employeeId", "#{empNo}") .body(StringBody(session => { println(session) println(session.attributes("empNo")) // 补充实际请求体内容(原代码此处无返回值,会导致空请求体) s"""{"empNo": "${session("empNo").as[String]}", "orderId": "${session("orderId").as[String]}"}""" })) ) }
方案2:基于foreach遍历全量数据(更直观)
直接让每个用户加载完整的CSV数据列表,用foreach遍历处理,无需手动指定重复次数:
// 移除全局的feederRound_1定义 def Submission_round1(): ChainBuilder = pause(pauseBy(5) seconds) // 每个用户加载全量CSV数据并shuffle,存入Session .exec(session => { val feederData = csv("data/data-1.csv").shuffle.readRecords session.set("feederData", feederData) }) // 遍历当前用户的专属数据列表 .foreach("${feederData}", "record") { pause(pauseBy(5) seconds) .exec(postToUri(s"${config.baseUrl}/base-orders/order", s"Submit orders for : ${record("orderId")}") .queryParam("employeeId", "${record.empNo}") .body(StringBody(session => { val record = session("record").as[Map[String, String]] println(record) println(record("empNo")) // 补充实际请求体内容 s"""{"empNo": "${record("empNo")}", "orderId": "${record("orderId")}"}""" })) ) }
额外注意点
原代码中StringBody未返回实际内容,会导致请求体为空,建议补充对应JSON或字符串格式的请求体。
内容的提问来源于stack exchange,提问作者Banu
相关产品推荐
相关产品推荐

