Scala 终止消息的目的是什么 导入akka.actor.{actor,Props,Terminated} 类WatchActor扩展了Actor{ val child=context.actorOf(Props.empty,“child”) 上下文。观察(儿童)// context.stop(子);lastssender=sender() 案例终止(`child`)=>lastSender!“已完成” } }

Scala 终止消息的目的是什么 导入akka.actor.{actor,Props,Terminated} 类WatchActor扩展了Actor{ val child=context.actorOf(Props.empty,“child”) 上下文。观察(儿童)// context.stop(子);lastssender=sender() 案例终止(`child`)=>lastSender!“已完成” } },scala,akka,Scala,Akka,我在这里对终止消息感到困惑 当一个演员创建一个子演员时,默认情况下它不是已经在看了吗? 如果那个儿童演员过早死亡,默认策略是重新启动它,对吗 上述代码片段中的终止消息的用途是什么?(摘自akka网站:) 如果子参与者终止,WatchActor将收到该消息?但是它正在发送lastssender()完成的消息,并且lastssender是子参与者,在这种情况下不是吗?目的是在子参与者死亡时获得通知。 谈到Akka文档中的示例,lastSender是向watchActor发送消息的参与者: impor

我在这里对
终止
消息感到困惑

当一个演员创建一个子演员时,默认情况下它不是已经在看了吗? 如果那个儿童演员过早死亡,默认策略是重新启动它,对吗

上述代码片段中的
终止
消息的用途是什么?(摘自akka网站:)


如果子参与者终止,
WatchActor
将收到该消息?但是它正在发送
lastssender()
完成的消息,并且
lastssender
是子参与者,在这种情况下不是吗?

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

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"
  }
}

另外,若你们问我这样复杂的协议的目的,我猜它是OOP式的单一责任。然而,在我看来,我从来都不喜欢akka用生命周期的东西来扭曲原始参与者的概念(IO协议和状态处理)。然而,这就是Akka的功能——流媒体库(Akka streams、fs2、monix)更简单,因此如果符合您的目的,您可以尝试使用它们。

没错,但我认为如果子角色是由watchActor创建的,则不需要显式调用context.watch。如果是另一个演员,那么对我来说是有意义的。@coolbreeze是的,akka的方法有点“深奥”,我加了一些小的“附言”,但当然要对我的观点持保留态度:)
lastSender    ----"kill"--->   watchActor   ---context.stop---> child
              <--"finished--                <--Terminated------
val child = context.actorOf(Props.empty, "child")
context.watch(child)