当我按照这个问题手动创建路线时,我问Possible to specify custom Routees or custom constructor arguments for each Actor。当需要重新启动routee时,如何处理监督?
答案 0 :(得分:2)
池路由器创建的路由将创建为路由器的子路由。因此路由器也是孩子的主管。
可以使用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)));