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)