如果我像这样创建一个日志记录演员
val logger: ActorRef =
actorSystem.actorOf(Props(new Logger()))
并且记录器由于异常而重新启动,我的记录器停止写入磁盘。
我一直在发送短信logger ! msg
我认为在主管重新启动我的日志记录演员时,ActorRef没有更新是否正确?
答案 0 :(得分:12)
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))
将失效。