2015-09-08 28 views

回答

2

Supervision documentation

Routees由池路由器創建將作爲路由器的孩子被創建。因此路由器也是兒童監督員。

路由器角色的監督策略可以使用池的supervisorStrategy屬性進行配置。如果未提供配置,則路由器默認爲「始終升級」策略。這意味着錯誤將傳遞給路由器的主管進行處理。路由器的主管將決定如何處理任何錯誤。

請注意,路由器的管理員會將錯誤視爲路由器本身的錯誤。因此,停止或重新啓動的指令會導致路由器本身停止或重新啓動。反過來,路由器將導致其孩子停止並重新啓動。

應該提及的是,路由器的重啓行爲已被覆蓋,因此在仍然重新創建子項的情況下重啓將仍然保留池中相同數量的actor。

這意味着如果您沒有指定路由器或其父母的supervisorStrategy,則路由器中的故障將升級到路由器的父路由器,默認情況下會重新啓動路由器,從而重新啓動所有路由(它使用升級並且在重啓期間不停止路由)。原因是使默認行爲是這樣的,即將Router添加到孩子的定義中並不會改變應用於孩子的監督策略。這可能是一種效率低下的情況,您可以通過在定義路由器時指定策略來​​避免這種情況。

制定戰略是很容易做到:

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))); 
相關問題