我有两个Actor实例,如下所示:
class MyActor1(actorRef2: Actor) extends Actor {
....
....
}
class MyActor2 extends Actor {
....
....
}
以上演员都是从顶级演员创建的,我有一些监督。
现在我的问题是,如果MyActor2以某种方式被杀死,我传入MyActor1的这个MyActor2的引用会发生什么? MyActor1是否仍然可以使用传入的引用发送消息,以便复活后的MyActor2仍然可以获取消息?
答案 0 :(得分:2)
发生什么取决于你的意思"杀死"以及MyActor2
的主管策略是什么。
如果通过MyActor2
方法停止对context.stop(myActor2)
的引用,例如MyActor2
,则:
当演员停止前,当前消息的处理(如果有)将继续,但不会处理邮箱中的其他消息。默认情况下,这些消息将发送到ActorSystem的deadLetters,但这取决于邮箱实现。
如果使用stop
消息停止对akka.actor.PoisonPill
的引用,则:
...
PoisonPill
消息...将在处理消息时停止actor。MyActor2
作为普通邮件排队,并将在已经在邮箱中排队的邮件之后处理。
如果使用PoisonPill
消息停止对PoisonPill
的引用,则:
与
ActorKilledException
不同,这将导致演员抛出[n]myActor2
,从而触发失败。演员将暂停操作,并且将询问其主管如何处理故障,这可能意味着恢复演员,重新启动或完全终止演员。
如果您使用context.stop
或PoisonPill
停止myActor2
,那么在该代理停止后发送给该角色的消息将转为死信。如果您发送Kill
一条ActorKilledException
消息,那么您为处理ActorKilledException
定义的任何主管策略都将启动。处理ActorKilledException
的{{3}}是停止演员,如上所述,这将导致演员停止后发送的所有消息进入死信箱。
您可以通过更改主管策略来覆盖此默认行为,以便在ActorRef
的情况下重新启动actor。重新开始保留active_apps_reported = [app for app in active_apps if any(app[0:2] ==
other[0:2] for other in reported_apps)]
active_apps_reported_2 = []
for app in active_apps:
for other_app in reported_apps:
if app[0:2] == other_app[0:2]:
active_apps_reported_2.append(app)
break
并且对具有对actor的引用的实体是透明的:在重新启动时发送给actor的消息将被正常处理。你也可以恢复演员,这基本上忽略了异常。