Akka演员传递演员参考

时间:2018-02-22 16:14:02

标签: akka

我有两个Actor实例,如下所示:

class MyActor1(actorRef2: Actor) extends Actor {
  ....
  ....
}

class MyActor2 extends Actor {
  ....
  ....
}

以上演员都是从顶级演员创建的,我有一些监督。

现在我的问题是,如果MyActor2以某种方式被杀死,我传入MyActor1的这个MyActor2的引用会发生什么? MyActor1是否仍然可以使用传入的引用发送消息,以便复活后的MyActor2仍然可以获取消息?

1 个答案:

答案 0 :(得分:2)

发生什么取决于你的意思"杀死"以及MyActor2的主管策略是什么。

  1. 如果通过MyActor2方法停止对context.stop(myActor2)的引用,例如MyActor2,则:

      

    当演员停止前,当前消息的处理(如果有)将继续,但不会处理邮箱中的其他消息。默认情况下,这些消息将发送到ActorSystem的deadLetters,但这取决于邮箱实现。

  2. 如果使用stop消息停止对akka.actor.PoisonPill的引用,则:

      

    ... PoisonPill消息...将在处理消息时停止actor。 MyActor2作为普通邮件排队,并将在已经在邮箱中排队的邮件之后处理。

  3. 如果使用PoisonPill消息停止对PoisonPill的引用,则:

      

    ActorKilledException不同,这将导致演员抛出[n] myActor2,从而触发失败。演员将暂停操作,并且将询问其主管如何处理故障,这可能意味着恢复演员,重新启动或完全终止演员。

  4. 如果您使用context.stopPoisonPill停止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的消息将被正常处理。你也可以恢复演员,这基本上忽略了异常。