使用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)
原因分析
- CSV解析异常:若CSV文件存在UTF-8 BOM头、空行或格式错误,Gatling无法正确识别数据行,导致feeder实际无有效条目,circular模式无法生效。
- Feeder实例重复消费:同一feeder实例被多个测试流程共享时,旧版本Gatling可能在循环逻辑触发前耗尽数据。
- 代码语法错误:
.asJson位置错误,虽不直接导致feeder空,但会破坏请求结构,间接引发流程异常。
解决办法
- 修复CSV文件:
- 确保文件无空行、格式规范,表头与数据行一一对应。
- 使用文本编辑器将文件保存为无BOM的UTF-8格式。
- 调整Feeder初始化:
- 为每个测试流程创建独立feeder实例,或显式调用
iterator确保循环逻辑生效:val feeder = csv("feeders/project_tenants.csv").circular.iterator
- 为每个测试流程创建独立feeder实例,或显式调用
- 修正代码语法:
- 将
.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)
- 添加日志打印feeder内容,确认数据是否正确加载:
内容的提问来源于stack exchange,提问作者aper714
相关产品推荐
相关产品推荐

