scala - Tomcat 中有很多 Akka 线程

标签 scala tomcat akka spray

我在 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 时,我都会看到它托管的事件线程数量激增。

VisualVM screencap

箭头指示何时对服务器进行调用。另请注意,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/

相关文章:

scala - 是否有关于 Scala 模式匹配可能性的完整规范?

Akka Cluster Starting 无法注册到协调器

scala - Akka readJournalPluginId 用于 inmem 日志插件

scala - 如何解构 Spray API HTTPResponse?

java - 将 Scala 嵌套 Map 转换为 Java 嵌套 util.Map

scala - 为什么隐式def而不是类需要隐式转换?

java - Spring MVC JSP 应用程序的 WAR 目录结构?

apache - 从 Apache 到 Tomcat 的子域 ajp 代理

java - 静态变量、Tomcat 和内存泄漏

scala - Akka Http 性能调优