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
在这种情况下是儿童演员吗?不是吗?
答案 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)来说更简单,所以你可以试试它们,如果它符合你的目的。