Akka演员班中的这对自我

Man*_*wat 5 scala actor akka akka-actor

假设我有一个非常简单的actor类,它接收任何消息并打印到控制台。

  class SimpleActor extends Actor{

    def receive: Receive = {
      case message =>
        println(s"[${this}][${self}] received message: ${message}")
    }
  }

  val simpleActor = actorSystem.actorOf(Props[SimpleActor], "simpleActor")
  simpleActor ! "Hey"
Run Code Online (Sandbox Code Playgroud)

如您所见,我在此处同时使用this和两者,self并且两者都有不同的值。其输出类似于:

[pkg.ActorRunner$SimpleActor@65cca69][Actor[akka://ActorDemo/user/simpleActor#934141660]] received message: Hey
Run Code Online (Sandbox Code Playgroud)

我想了解和之间的区别selfthis因为在复杂的场景(生产系统)中,如果演员中断,例如:抛出异常,我认为价值this会发生变化。

gab*_*ssi 8

this是对对象扩展Actor特征的经典java引用,而selfActorRef则是您需要发送消息(!or tell?or ask)的引用

  • 您无法将邮件发送到 this
  • 您不应传递对this外部actor的引用,而将引用传递给self完全很好,实际上,当您从另一个actor向一个actor发送消息时,它会隐式发送。如果传递this给另一个对象,则将冒充actor的状态封装的风险。请记住,与演员交流的唯一方法是通过消息,即与演员进行交流。ActorRef
  • self在actor重新启动后将保持有效,也就是您可以继续向同一ActorRef个人发送消息。仅当actor停止时,对该引用的引用才ActorRef不再有效,发送到该地址的消息将以Dead Letters结尾。
  • thisactor重新启动后将不再有效。Actor实例化一个新的类型的对象,以清除由于故障而可能受损的参与者状态。

重新启动意味着什么

除非可以明确识别出故障,否则不能排除第三个原因,这导致需要清除内部状态的结论。如果主管确定其其他子项或自身不受损坏的影响(例如,由于有意识地应用了错误内核模式),则最好重新启动该子项。这是通过创建基础Actor类的新实例并将失败的实例替换为子级的ActorRef中的新实例来完成的。这样做的能力是将参与者封装在特殊引用中的原因之一。然后,新角色会继续处理其邮箱,这意味着重新启动在角色外部不可见 本身是一个明显的例外,发生故障的消息不会被重新处理。

演员参考和路径平等

请注意,由故障导致的actor重新启动仍然意味着它是同一actor的化身,即ActorRef的使用者看不到重新启动。

Actor参考和Path有什么区别?

参与者参考指定单个参与者,参考的生命周期与该参与者的生命周期匹配。一个actor路径代表一个名称,该名称可能由actor占用也可能没有,并且该路径本身没有生命周期,因此永远不会无效。您可以在不创建角色的情况下创建角色路径,但是在不创建相应角色的情况下不能创建角色引用。
您可以创建一个actor,将其终止,然后使用相同的actor路径创建一个新actor。新创建的演员是演员的新化身。不是同一位演员。演员对旧的化身的引用对新的化身无效。发送到旧角色参考的消息即使路径相同,也不会传递到新角色。