我在Tomcat 8中托管我的Scala (2.11) WAR,并使用akka 2.3.+和spray-client 1.3.3。我只对一个演员使用Akka,当Tomcat开始的时候,我会给它打一个电话。它也可以手动调用。
class RefreshDataActor extends Actor with ActorLogging {
override def receive: Receive = {
case _ =>
implicit val timeout: Timeout = someTimeout
implicit val ec = this.context.dispatcher
val pipeline = sendReceive ~> unmarshal[Data]
pipeline(Get(fileUrl))
.onComplete {
case Success(data) =>
// Do stuff with the data
case Failure(ex) =>
this.log.error("Unable to find the latest version of the data!", ex)
}
}
}每当任何调用进入Tomcat时,我都会看到它承载的活动线程数量激增。

箭头指示何时调用服务器。还请注意,CPU也在缓慢上升,并且在某一时刻,机器会非常努力地工作,似乎什么都没有(屏幕中的机器有8个核心)。
通过将VisualVM连接到受此影响的计算机之一,我开始调试这个问题。仍然活着的线程名为default-akka.actor.default-dispatcher-X ( X通常是2到7之间的任意数字),所有这些线程都在等待和default-scheduler-1 (TIMED_WAITING)。有几百个,,还有一个default-akka.io.pinned-dispatcher-5 (可运行的)。
我假设这与Akka的工作方式有关,但我不明白这是为什么。
发布于 2015-09-16 14:56:52
发现了问题。我不止一次调用ActorSystem(),它创建了一个新的参与者系统,而不是重用已经创建的系统。这导致越来越多的系统被创建,并且由于某种原因没有被移除。
https://stackoverflow.com/questions/32611080
复制相似问题