Terminated消息的目的是什么?

时间:2017-02-02 15:39:51

标签: scala akka

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消息感到困惑。

当一个演员创建一个儿童演员时,默认情况下它是否已经观看过? 如果那个儿童演员过早死亡,默认策略是重新正确吗?

上述代码段中Terminated消息的用途是什么? (摘自akka网站:http://doc.akka.io/docs/akka/2.4/scala/actors.html

如果子actor终止,WatchActor将收到该消息?但它正在发送lastSender()&#34;已完成&#34;消息,lastSender在这种情况下是儿童演员吗?不是吗?

1 个答案:

答案 0 :(得分:1)

目的是在儿童演员去世时获得通知。 在Akka docs中讨论示例时,lastSender是向watchActor发送消息的actor:

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

所以,lastSender是一个发送了&#34; kill&#34;的演员。用于委派查杀程序的消息(字符串)。它与child不同,与watchActor

不同

另一个问题是,中间的WatchActor(有点&#34; Hitman&#34;而不仅仅是监视器)最初可能不会创建一个孩子,这就是为什么它必须订阅演员的生命周期名为 as&#34; child&#34;,您可以从该示例中看到:

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

P.S。如果你问我关于这种复杂协议的目的,我的猜测是它是OOP的单一责任。然而,IMO,我从来不喜欢akka用生命周期的东西歪曲了原始演员的概念(IO协议和状态处理)。但是,这就是你用Akka获得的 - 它对流媒体库(akka-streams,fs2,monix)来说更简单,所以你可以试试它们,如果它符合你的目的。