为路由器手动创建路由时,它们如何通过监督策略重新启动?

时间:2015-09-08 14:10:01

标签: java akka

当我按照这个问题手动创建路线时,我问Possible to specify custom Routees or custom constructor arguments for each Actor。当需要重新启动routee时,如何处理监督?

1 个答案:

答案 0 :(得分:2)

来自Supervision documentation

  

池路由器创建的路由将创建为路由器的子路由。因此路由器也是孩子的主管。

     

可以使用Pool的supervisorStrategy属性配置路由器actor的监督策略。如果未提供配置,则路由器默认采用“始终升级”策略。这意味着错误会传递给路由器的主管进行处理。路由器的主管将决定如何处理任何错误。

     

请注意,路由器的主管会将错误视为路由器本身的错误。因此,停止或重新启动的指令将导致路由器本身停止或重新启动。反过来,路由器将导致其子节点停止并重新启动。

     

应该提到路由器的重启行为已被覆盖,以便在重新创建子节点时重新启动仍将保留池中相同数量的actor。

     

这意味着如果你没有指定路由器或其父路由器的supervisorStrategy,路由器中的故障将升级到路由器的父路由器,默认情况下将重新启动路由器,路由器将重新启动所有路由(它使用Escalate和在重启期间不会停止路线)。原因是使默认行为使得在子定义中添加withRouter不会改变应用于子项的监督策略。通过在定义路由器时指定策略,这可能是一种效率低下的问题。

     

轻松完成策略设置:

final SupervisorStrategy strategy =
    new OneForOneStrategy(5, Duration.create(1, TimeUnit.MINUTES),
Collections.<Class<? extends Throwable>>singletonList(Exception.class));
final ActorRef router = system.actorOf(new RoundRobinPool(5).
    withSupervisorStrategy(strategy).props(Props.create(Echo.class)));