当主管重新启动关联的Actor时,是否更新了ActorRef?

时间:2016-02-11 07:10:30

标签: scala akka actor supervisor

如果我像这样创建一个日志记录演员

val logger: ActorRef =
    actorSystem.actorOf(Props(new Logger()))

并且记录器由于异常而重新启动,我的记录器停止写入磁盘。

我一直在发送短信logger ! msg

我认为在主管重新启动我的日志记录演员时,ActorRef没有更新是否正确?

1 个答案:

答案 0 :(得分:12)

Akka应该正确更新

ActorRef以指向演员的新实例。 docs明确指出:

  

指向已终止的actor的引用不会比较等于   指向具有相同路径的另一个(重新创建的)actor的引用。   请注意,由故障引起的actor的重启仍然意味着   它是同一个演员化身,即重启不可见   ActorRef的消费者

另外here

  

当调用actorOf()时,它会指定actor的化身   由传递的道具描述到给定的路径。演员化身   由路径和UID标识。 重启只会交换Actor   由道具定义的实例,但是化身,因此是UID   保持不变。

     

当演员停止时,化身的生命周期结束。在   这一点,适当的生命周期事件被调用和观察   演员被告知终止。 化身之后   停止后,可以通过创建一个actor来重新使用该路径   actorOf()。在这种情况下,新化身的名称将是   与前一个相同,但UID会有所不同。 ......

     

ActorRef总是代表一个化身(路径和UID)   只是给定的路径。因此,如果一个演员被停止而且一个新演员被停止   创建相同名称的旧化身的ActorRef不会   指向新的。

这是使用ActorRef的主要优势之一,否则与演员合作会更加不方便。

您需要检查您的主管策略并确保该actor已实际重新启动。 默认策略是:

final val defaultStrategy: SupervisorStrategy = {
  def defaultDecider: Decider = {
    case _: ActorInitializationException ⇒ Stop
    case _: ActorKilledException         ⇒ Stop
    case _: Exception                    ⇒ Restart
  }
  OneForOneStrategy()(defaultDecider)
}

因此,如果您获得Exception,您的演员将重新启动且ActorRef应该有效,但如果您获得其他类型的Throwable,则会停止ActorRef import hashlib email = 'email@m.com' pass = 'xxxxx' encrypted_password = hashlib.sha1(b(email + passw)) 将失效。