我在 Tomcat 8 中托管 Scala (2.11) WAR,并使用 akka
2.3.+ 和 spray-client
1.3.3。我仅将 Akka 用于一个 Actor,并在 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
(可运行)。
我假设这与 Akka 的工作方式有关,但不明白为什么会这样。
最佳答案
发现问题了。我多次调用 ActorSystem()
,这创建了一个新的 Actor 系统,而不是重用已经创建的系统。这导致越来越多的系统被创建,并且由于某种原因而无法被删除。
关于scala - Tomcat 中有很多 Akka 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32611080/