从Actor关闭Akka Actor系统

时间:2015-02-04 15:04:09

标签: scala akka

我知道我可以在actor系统之外使用system.shutdown()来停止actor系统并使system.awaitTermination()停止阻塞其线程上的执行。

我想从我的一个Actors中触发actor系统关闭。我以为我应该能够在Actor的receive方法中调用context.system.shutdown(),但是当我这样做时似乎没有任何事情发生,system.awaitTermination()(在主线程上)只是继续阻塞。

有什么想法吗?

3 个答案:

答案 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()