【问题标题】:Shutting down an Akka Actor system from an Actor从 Actor 关闭 Akka Actor 系统
【发布时间】:2015-02-04 15:04:09
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    如何编写一个 Actor 来杀死自己

    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

    【讨论】:

    • 请不要只发布链接答案。只需将链接的基本部分放在您的答案中
    【解决方案2】:

    你不应该这样做:就像蛇咬自己的尾巴

    system.awaitTermination() 将继续阻塞,因为您正在等待它结束!

    你可以在一个actor中完美地调用context.system.shutdown(),但是你不能在actor系统上下文中调用system.awaitTermination()。而且它也没有多大意义:你为什么要等待,因为之后无论如何都没有执行任何操作,系统已关闭?

    如果您想在系统停止后执行进一步的指令,则阻止系统关闭仅在系统之外才有意义。

    【讨论】:

    • 我不是从演员内部打电话给system.awaitTermination()。该调用在主线程上,即负责启动actor系统的同一线程。我的问题是,当我从演员内部调用context.system.shutdown () 时,系统不会关闭,并且阻塞等待关闭的主线程只是继续阻塞。
    • 对不起,我读得太快的错误。您确定您的系统中没有执行其他任何操作吗?
    【解决方案3】:

    主线程:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多