2012-09-07 31 views
5

我已经编写了启动演员的示例代码,将其杀死并完成执行。正确地终止了scala中的akka​​演员

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”。 –

回答

8

也许打电话给ActorSystem.shutdown()会做伎俩。

按照akka docs

抽象高清shutdown(): Unit

停止这个演员系统。这将阻止监护者actor,这反过来将递归地停止其所有的子actor,然后是系统监护人(记录执行者所在的系统守护程序)以及执行所有注册的终止处理程序(请参阅ActorSystem.registerOnTermination)。

+1

请注意:[从Akka 2.4开始](http://doc.akka.io/docs/akka/snapshot/project/migration-guide-2.3.x-2.4.x.html#Actor_system_shutdown),您应该使用ActorSystem .terminate()'。这会返回一个'Future [Terminated]'你可能会等待。 – 203