这个vs自我内部的akka 演员类

问题描述 投票:4回答:1

假设我有一个非常简单的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"

如你所见,我在这里使用thisself,两者都有不同的值。它的输出类似于:

[pkg.ActorRunner$SimpleActor@65cca69][Actor[akka://ActorDemo/user/simpleActor#934141660]] received message: Hey

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

scala akka actor akka-actor
1个回答
8
投票

this是对扩展Actor特征的对象的经典java引用,而self是对你需要发送消息的ActorRef的引用(!tell?ask

  • 你不能发送消息给this
  • 你不应该在引用this之前传递对actor之外的self的引用是完全没问题的,实际上当你从另一个actor向一个actor发送一条消息时它会被隐式发送。如果你将this传递给另一个对象,你将面临演员的状态封装风险。请记住,与演员沟通的唯一方式是通过消息,即使用ActorRef
  • 演员重启后,self仍然有效,也就是说你可以继续向同一个ActorRef(自我)发送消息。只有当演员停止时,对ActorRef的引用不再有效,发送到该地址的消息将以Dead Letters结尾。
  • 演员重启后,this将不再有效。实例化Actor类型的新对象以清除可能由于失败而受到损害的actor状态。

What restarting means

除非故障是特别可识别的,否则不能排除第三个原因,这导致了内部状态需要被清除的结论。如果主管决定其他孩子或其本身不受腐败影响 - 例如。因为有意识地应用了错误内核模式 - 因此最好重启子进程。这是通过创建底层Actor类的新实例并使用子Actor的ActorRef中的新实例替换失败的实例来实现的;执行此操作的能力是将actor封装在特殊引用中的原因之一。然后,新的actor继续处理其邮箱,这意味着重新启动在actor本身之外是不可见的,但是没有重新处理发生故障的消息。

Actor Reference and Path Equality

请注意,由失败引起的actor的重启仍然意味着它是相同的actor化身,即对于ActorRef的使用者来说,重启是不可见的。

What is the Difference Between Actor Reference and Path?

actor参考指定一个actor,参考的生命周期与actor的生命周期相匹配;一个actor路径代表一个名字,该名字可能是也可能不是由演员居住,而且路径本身没有生命周期,它永远不会变得无效。您可以在不创建actor的情况下创建actor路径,但是如果不创建相应的actor,则无法创建actor引用。 您可以创建一个actor,终止它,然后使用相同的actor路径创建一个新的actor。新创建的演员是演员的新化身。这不是同一个演员。对旧化身的演员引用对新的化身无效。发送到旧actor参考的消息即使具有相同的路径,也不会被传递给新的化身。

© www.soinside.com 2019 - 2024. All rights reserved.