我在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之间的任何数字),所有这些都是WAITING和default-scheduler-1
(TIMED_WAITING)。 有几百个。还有一个default-akka.io.pinned-dispatcher-5
(RUNNABLE)。
我认为这与Akka如何运作有关,但不明白为什么会这样。
答案 0 :(得分:2)
发现了这个问题。我不止一次地调用ActorSystem()
,这创建了一个新的actor系统,而不是重用已经创建的系统。这导致越来越多的系统被创建,并且由于某种原因,不会被删除。