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

使用Circular CSV Feeder触发IllegalStateException问题求助

Gatling循环Feeder抛出空异常的排查与解决

问题复现

在Gatling性能测试中,配置CSV feeder并启用circular循环模式,但即使仅运行单个会话,仍抛出IllegalStateException: Feeder is now empty, stopping engine异常。

使用代码

Feeder定义:

val feeder = csv("feeders/project_tenants.csv").circular

测试流程:

def updateDbSettings = feed(feeder)
    exec(http("Update Project Settings")
    .post("/url/here")
    .body(StringBody("""{"sqlServer":"${server}.test.int","sqlDatabase":"COMP_DB", "dataCenter":"HAI"}"""))).asJson)

CSV文件内容

server,test
check,a
check1,b
check2,c
check3,d

异常堆栈信息

14:18:39.076 [ERROR] i.g.a.Gatling$ - Run crashed
java.lang.IllegalStateException: Feeder is now empty, stopping engine
        at io.gatling.core.action.SingletonFeed$$anonfun$receive$1.applyOrElse(SingletonFeed.scala:67)
        at akka.actor.Actor.aroundReceive(Actor.scala:539)
        at akka.actor.Actor.aroundReceive$(Actor.scala:537)
        at io.gatling.core.akka.BaseActor.aroundReceive(BaseActor.scala:25)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:612)
        at akka.actor.ActorCell.invoke(ActorCell.scala:581)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:268)
        at akka.dispatch.Mailbox.run(Mailbox.scala:229)
        at akka.dispatch.Mailbox.exec(Mailbox.scala:241)
java.lang.reflect.InvocationTargetException
        at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.gatling.mojo.MainWithArgsInFile.runMain(MainWithArgsInFile.java:50)
        at io.gatling.mojo.MainWithArgsInFile.main(MainWithArgsInFile.java:33)
Caused by: java.lang.IllegalStateException: Feeder is now empty, stopping engine
[ERROR] [07/25/2022 14:18:39.118] [GatlingSystem-akka.actor.default-dispatcher-7] [akka.actor.ActorSystemImpl(GatlingSystem)] ex        at io.gatling.core.action.SingletonFeed$$anonfun$receive$1.applyOrElse(SingletonFeed.scala:67)
ception while executing timer task
        at akka.actor.Actor.aroundReceive(Actor.scala:539)
java.lang.NullPointerException
        at io.gatling.core.akka.BaseActor.system(BaseActor.scala:27)
        at akka.actor.Actor.aroundReceive$(Actor.scala:537)
        at io.gatling.graphite.sender.TcpSender.askForConnection(TcpSender.scala:103)
        at io.gatling.core.akka.BaseActor.aroundReceive(BaseActor.scala:25)
        at io.gatling.graphite.sender.TcpSender$$anonfun$1.$anonfun$applyOrElse$1(TcpSender.scala:58)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:612)
        at akka.actor.Scheduler$$anon$4.run(Scheduler.scala:202)
        at akka.actor.ActorCell.invoke(ActorCell.scala:581)
        at akka.actor.LightArrayRevolverScheduler$TaskHolder.run(LightArrayRevolverScheduler.scala:343)
        at akka.actor.LightArrayRevolverScheduler.$anonfun$close$1(LightArrayRevolverScheduler.scala:145)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:268)
        at akka.dispatch.Mailbox.run(Mailbox.scala:229)
        at akka.actor.LightArrayRevolverScheduler.$anonfun$close$1$adapted(LightArrayRevolverScheduler.scala:144)
        at akka.dispatch.Mailbox.exec(Mailbox.scala:241)
        at scala.collection.Iterator.foreach(Iterator.scala:941)
        at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at scala.collection.Iterator.foreach$(Iterator.scala:941)
        at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1429)
        at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
        at scala.collection.IterableLike.foreach(IterableLike.scala:74)
        at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
        at akka.actor.LightArrayRevolverScheduler.close(LightArrayRevolverScheduler.scala:144)
        at akka.actor.ActorSystemImpl.stopScheduler(ActorSystem.scala:980)
        at akka.actor.ActorSystemImpl.$anonfun$_start$1(ActorSystem.scala:910)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at akka.actor.ActorSystemImpl$$anon$2.run(ActorSystem.scala:931)
        at akka.actor.ActorSystemImpl$TerminationCallbacks$$anonfun$addRec$1$1.applyOrElse(ActorSystem.scala:1118)
        at akka.actor.ActorSystemImpl$TerminationCallbacks$$anonfun$addRec$1$1.applyOrElse(ActorSystem.scala:1118)
        at scala.concurrent.Future.$anonfun$andThen$1(Future.scala:536)
        at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:33)
        at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:33)
        at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
        at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
        at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:92)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:85)
        at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:92)
        at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41)
        at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:49)
        at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

原因分析

  1. CSV解析异常:若CSV文件存在UTF-8 BOM头、空行或格式错误,Gatling无法正确识别数据行,导致feeder实际无有效条目,circular模式无法生效。
  2. Feeder实例重复消费:同一feeder实例被多个测试流程共享时,旧版本Gatling可能在循环逻辑触发前耗尽数据。
  3. 代码语法错误:.asJson位置错误,虽不直接导致feeder空,但会破坏请求结构,间接引发流程异常。

解决办法

  • 修复CSV文件:
    • 确保文件无空行、格式规范,表头与数据行一一对应。
    • 使用文本编辑器将文件保存为无BOM的UTF-8格式。
  • 调整Feeder初始化:
    • 为每个测试流程创建独立feeder实例,或显式调用iterator确保循环逻辑生效:
      val feeder = csv("feeders/project_tenants.csv").circular.iterator
      
  • 修正代码语法:
    • 将.asJson移至body方法后,确保请求体被正确标记为JSON:
      def updateDbSettings = feed(feeder)
        .exec(http("Update Project Settings")
          .post("/url/here")
          .body(StringBody("""{"sqlServer":"${server}.test.int","sqlDatabase":"COMP_DB", "dataCenter":"HAI"}"""))
          .asJson)
      
  • 验证Feeder数据:
    • 添加日志打印feeder内容,确认数据是否正确加载:
      println("Feeder content: " + feeder.toList)
      

内容的提问来源于stack exchange,提问作者aper714

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:36:20