在Scala中正确终止Akka actors

5
我已经编写了一个启动actor、终止它并完成执行的示例代码。
object PureAkka {
  def main(argv : Array[String]) = {
    val actorSystem : ActorSystem = ActorSystem("main")
    val actor : ActorRef = actorSystem.actorOf(Props( new Actor {
      override def receive = {
        case x => println(x)
      }
      override def preStart() = println("prestart")
      override def postStop() = println("poststop")
    } ) )
    Thread.sleep(15000)
    actor ! PoisonPill
  }
}

这段代码会输出:
[info] prestart
[info] poststop

但是它不会停止,直到我使用Ctrl-C杀死进程。

应用程序在等待什么?如何以正确的方式停止它?


2
Akka文档可能会在http://doc.akka.io/api/akka/2.0.3/#akka.actor.Actor中有所帮助,其中提到了`context.stop`。 - Augustus Kling
1个回答

8
也许调用ActorSystem.shutdown()能解决问题。
根据akka文档
抽象定义 shutdown(): Unit 停止这个actor系统。这将会停止guardian actor,然后递归停止它的所有子actor,接着停止系统guardian(logging actors所依赖的guardian),最后执行所有已注册的终止处理程序(见ActorSystem.registerOnTermination)。

1
请注意:从Akka 2.4开始,您应该使用ActorSystem.terminate()。这将返回一个Future[Terminated],您可以等待它完成。 - 203

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接