【问题标题】:What is the purpose of the Terminated message终止消息的目的是什么
【发布时间】:2017-02-02 15:39:50
【问题描述】:
import akka.actor.{ Actor, Props, Terminated }

class WatchActor extends Actor {
  val child = context.actorOf(Props.empty, "child")
  context.watch(child) // <-- this is the only call needed for registration
  var lastSender = context.system.deadLetters

  def receive = {
    case "kill" =>
      context.stop(child); lastSender = sender()
    case Terminated(`child`) => lastSender ! "finished"
  }
}

我在这里对Terminated 消息感到困惑。

当一个actor创建一个子actor时,它不是已经默认观看了吗? 如果那个子actor过早死亡,默认策略是正确重启它吗?

上述代码sn-p中Terminated消息的作用是什么? (取自akka网站:http://doc.akka.io/docs/akka/2.4/scala/actors.html

如果子角色终止,WatchActor 会收到该消息吗?但它正在向lastSender() 发送“完成”消息,而lastSender 在这种情况下是子actor,不是吗?

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    目的是在子actor死亡时获得通知。 谈到 Akka 文档中的示例,lastSender 是向 watchActor 发送消息的演员:

    lastSender    ----"kill"--->   watchActor   ---context.stop---> child
                  <--"finished--                <--Terminated------
    

    所以,lastSender 是一个发送“kill”消息(字符串)来委派杀戮过程的参与者。和child不一样,和watchActor不一样

    另一个问题是中间 WatchActor(一种“杀手”,而不仅仅是监视器)最初可能不会创建一个孩子,所以这就是为什么它必须订阅演员的生命周期命名为“孩子” ,正如您从该示例中看到的那样:

    val child = context.actorOf(Props.empty, "child")
    context.watch(child)
    

    附:如果你问我这种复杂协议的目的,我猜它是类似 OOP 的单一职责。但是,IMO,我从不喜欢 akka 用生命周期的东西扭曲原始参与者的概念(IO 协议和状态处理)。但是,这就是您使用 Akka 所获得的 - 使用流式库(akka-streams、fs2、monix)会更简单,因此如果适合您的目的,您可以尝试它们。

    【讨论】:

    • 确实如此,但我想如果子actor是由watchActor创建的,就不需要显式调用context.watch。如果是另一个演员,那对我来说很有意义。
    • @coolbreeze 是的,akka 的方法有点“深奥”,我添加了一些小“P.S.”关于它,但当然要对我的意见持保留态度:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2012-07-22
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多