我知道我可以在actor系统之外使用system.shutdown()
来停止actor系统并使system.awaitTermination()
停止阻塞其线程上的执行。
我想从我的一个Actors中触发actor系统关闭。我以为我应该能够在Actor的receive方法中调用context.system.shutdown()
,但是当我这样做时似乎没有任何事情发生,system.awaitTermination()
(在主线程上)只是继续阻塞。
有什么想法吗?
答案 0 :(得分:1)
如何编程演员杀死自己
class WatchActor extends Actor {
val child = context.actorOf(Props.empty, "child")
context.watch(child) // <-- this is the only call needed for registration
var lastSender = system.deadLetters
def receive = {
case "kill" =>
context.stop(child); lastSender = sender()
case Terminated(`child`) => lastSender ! "finished"
}
}
在这个网址上有一个很好的解释。
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
JFM
答案 1 :(得分:0)
你不应该这样做:它就像一条咬着自己尾巴的蛇。
system.awaitTermination()
将继续阻止,因为您正在等待它结束!
您可以在演员中完美地调用context.system.shutdown()
,但不能在演员系统上下文中调用system.awaitTermination()
。而且它没有多大意义:你为什么要等待,因为事后无论如何都无法执行,系统会崩溃?
如果要在停止后执行进一步的指令,阻止系统关闭只能在它之外有意义。
答案 2 :(得分:0)
主线程:
val l = new CountDownLatch(1)
val s = ActorSystem("system", config)
...
//create some actors and send some messages to them
...
l.await()
s.shutdown()
s.awaitTermination()
def receive: Actor.Receive
中的某些地方:
l.countDown()