当没有任何事情发生时,Akka在做什么?

时间:2017-03-07 19:40:27

标签: akka

我有非常简单的应用程序(2个actor)通过套接字发送文件。应用程序使用Spring Boot和Akka,传输完成后,没有其他任何事情发生。但是,我注意到即使在传输之后CPU使用率也很高(例如4核心机器上的50%,所以完全2核心)。我捕获了活动线程的快照,其中约1/3属于Akka。

Akka在做什么,为什么需要这么多cpu?

http://pastebin.com/CF9yUvuL

1 个答案:

答案 0 :(得分:1)

通常回答你的问题:Akka创建一个用于进行异步消息处理的线程池。因此,如果你编写如下代码,你的应用程序永远不会终止,因为Akka继续运行。

class Root extends Actor {

  // create some child actors to do some work

  override def receive: Receive = Actor.emptyBehavior
}

object Main {

  def main(args: Array[String]): Unit = {
    val system = ActorSystem("main")
    system.actorOf(Props(new Root))
  }
}

通常,如果您需要终止应用程序,您将定义一条消息,表明已完成所有工作并将此消息发送给您的根执行者。然后,root actor可以调用context.system.terminate()来终止系统。

回到你的问题,我不明白你为什么要把Akka和Spring Boot结合起来。你的线程转储,我不确定问题是否与Akka有关。看起来线程挂在HttpClient中。你确定已经释放并关闭了所有打开的连接吗?