从一个Actor关闭Akka Actor系统

4

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

我想从我的一个Actor内触发actor系统的关机。 我认为应该能够在Actor的接收方法中调用context.system.shutdown(),但是当我这样做时,似乎什么都没有发生,system.awaitTermination()(在主线程上)仍然继续阻塞。

有任何想法吗?

3个回答

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


请不要只发布链接答案。请在您的回答中放置链接的必要部分。 - Rizier123

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

0
你不应该这样做:这就像蛇咬自己的尾巴一样system.awaitTermination() 会一直阻塞,因为你正在等待它结束!
你可以在Actor内部完美地调用context.system.shutdown(),但你不能在Actor系统上下文中调用system.awaitTermination()。而且它也没有太多意义:既然系统已经关闭了,为什么还要等待呢?
只有在系统外部,如果你想在它停止后执行进一步的指令,阻塞系统关闭才有意义。

我没有在actor内部调用system.awaitTermination()。该调用在主线程上,也就是启动actor系统的线程上。我的问题是,当我从actor内部调用context.system.shutdown()时,系统无法关闭,而主线程则一直阻塞等待关闭。 - sungiant
抱歉,我读得太快了,你确定系统中没有其他程序在执行吗? - Jean Logeart

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