You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:33:23