首页 文章

在gatling中使用scala迭代器时出现并发错误

提问于
浏览
0

我正在使用gatling来运行负载测试 . 我不是一个gatling或scala专家,但在我看来,这个特殊的问题可能与scala(和Akka)有关,而不是与gatling本身有关 . 我将从最后开始:当在不太强大的机器上以高负载运行时,我偶尔会收到此错误:

07:04:42.071 [错误] igcabSessionHookBuilder $$ anonfun $ build $ 1 $$ anon $ 1 - 'sessionHook-29'在会话中崩溃(searchOrder,5348761459522421680-8295,Map(),1433329482056,0,OK,List( ),转发到下一个java.lang.UnsupportedOperationException:scala.collection.immutable.Nil $ .tail(List.scala:422)〜[scala-library-2.11.6.jar:na]中空列表的尾部] scala.collection.immutable.Nil $ .tail(List.scala:417)〜[scala-library-2.11.6.jar:na] at scala.collection.LinearSeqLike $$ anon $ 1.next(LinearSeqLike.scala: 46)〜[scala-library-2.11.6.jar:na]在scala.collection.TraversableOnce $ FlattenOps $$ anon $ 1.next(TraversableOnce.scala:450)〜[scala-library-2.11.6.jar:na ] MyNamespace.Tenants $ .next(Tenants.scala:21)〜[na:na] at MyNamespace.LoadTests $$ anonfun $ run $ 1.apply(LoadTests.scala:43)〜[na:na] at MyNamespace.LoadTests $$ anonfun $ run $ 1.apply(LoadTests.scala:41)〜[na:na] at io.gatling.core.action.SessionHook.executeOrFail(SessionHook.scala:35)〜[gatling-core-2.1.5 . jar:2.1.5]在io.gatli ng.core.action.Failable $ class.execute(Actions.scala:71)〜[gatling-core-2.1.5.jar:2.1.5] at io.gatling.core.action.SessionHook.execute(SessionHook.scala :28)〜[gatling-core-2.1.5.jar:2.1.5] at io.gatling.core.action.Action $$ anonfun $ receive $ 1.applyOrElse(Actions.scala:29)〜[gatling-core- 2.1.5.jar:2.1.5]在scala.PartialFunction $ OrElse.applyOrElse(PartialFunction.scala:171)〜[scala-library-2.11.6.jar:na] at akka.actor.Actor $ class.aroundReceive( Actor.scala:465)〜[akka-actor_2.11-2.3.9.jar:na] at io.gatling.core.akka.BaseActor.aroundReceive(BaseActor.scala:22)〜[gatling-core-2.1.5 .jar:2.1.5] at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)〜[akka-actor_2.11-2.3.9.jar:na] at akka.actor.ActorCell.invoke(ActorCell.scala :487)〜[akka-actor_2.11-2.3.9.jar:na] at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:254)〜[akka-actor_2.11-2.3.9.jar:na] at akka.dispatch.Mailbox.run(Mailbox.scala:221)〜[akka-actor_2.11-2.3.9.jar:na] at akka.dispatch.Mailbox.exec(Mailbox.scala:231)〜[akka-雅图r_2.11-2.3.9.jar:na] at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)〜[scala-library-2.11.6.jar:na] at scala.concurrent.forkjoin . ForkJoinPool $ WorkQueue.runTask(ForkJoinPool.java:1339)〜[scala-library-2.11.6.jar:na]在scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)[scala-library-2.11 . 6.jar:na] at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)[scala-library-2.11.6.jar:na]

我怀疑它与使用有关

Iterator.continually([some collection]).flatten

其中[some collection]是我试图循环循环的集合 . 可能是因为当许多并发线程试图访问以这种方式定义的迭代器时偶尔会失败?有没有更好的方法来创建一个也是线程安全的循环迭代器?

在下面的“保存”方法创建的租户对象中(实际上,这里有更多的代码填充get方法检索的集合,因此它实际上永远不会为空):

import io.gatling.core.Predef._

object Tenants {
  type TenantKeys = Map[String, Map[String, String]]
  val key = "tenants"
  val elementKey = "tenant"
  var tenants: Iterator[Map[String, String]] = Iterator(Map[String, String]())

  def get(session: Session): TenantKeys = {
    session(key)
      .asOption[TenantKeys]
      .getOrElse(Map[String, Map[String, String]]())
  }

  def save(session: Session): Session = {
    val mapped = get(session).map(_._2).toSeq
    tenants = Iterator.continually(mapped).flatten
    session
  }
}

1 回答

  • 0

    你在做什么不能简单地工作 . 这不是Scala的问题,而是并发编程之一 . 就像Java Iterators一样,Scala也不是线程安全的 .

    使用Gatling的 feed() 这是线程安全的 .

相关问题