2014-07-26 31 views
5

Mam aktora rodziców Akka z kilkorgiem dzieci. Kiedy aktor nadrzędny zostanie zrestartowany, potrzebuję go po prostu zatrzymać swoje dzieci, zamiast zatrzymywać je i ponownie tworzyć lub ponownie uruchamiać. (Dziecko zostanie utworzone ręcznie później, jeśli będzie potrzebne). Czy istnieje sposób, aby to zrobić? Być może przez przesłonięcie metody rodzica w jakiś sposób?Jak po prostu zatrzymać aktorów dziecięcych po ponownym uruchomieniu rodzica?

+0

w jaki sposób tworzysz dzieci: bezwarunkowo podczas inicjowania przez rodzica lub podczas odbierania? –

+0

@AlekseyIzmailov On receive. – Lasf

+0

Wygląda na to, że dzieci utworzone podczas odbierania (a nie podczas inicjowania rodziców) są zatrzymywane, ale nie są ponownie tworzone. Jednak nie przekonałem się o tym. Czy ktoś może potwierdzić, że to faktyczne zachowanie? – Lasf

Odpowiedz

3

Domyślnie Actor unieszkodliwia dzieci po ponownym uruchomieniu. Oto kod Actor.preRestart:

/** 
    * User overridable callback: '''By default it disposes of all children and then calls `postStop()`.''' 
    * @param reason the Throwable that caused the restart to happen 
    * @param message optionally the current message the actor processed when failing, if applicable 
    * <p/> 
    * Is called on a crashed Actor right BEFORE it is restarted to allow clean 
    * up of resources before Actor is terminated. 
    */ 
    @throws(classOf[Exception]) // when changing this you MUST also change UntypedActorDocTest 
    //#lifecycle-hooks 
    def preRestart(reason: Throwable, message: Option[Any]): Unit = { 
    context.children foreach { child ⇒ 
     context.unwatch(child) 
     context.stop(child) 
    } 
    postStop() 
    } 

Jak widać rodzic przestanie i unwatch swoich dzieci. Można zastąpić go tak, aby zachować aktorem to dzieci żyje:

override def preRestart(reason: Throwable, message: Option[Any]): Unit =() 

więc do swoich celów nie trzeba zastąpić preRestart a dostaniesz pożądanego zachowania. Możesz spojrzeć na inne wywołania zwrotne, jeśli chcesz mieć więcej niestandardowych zachowań, takich jak uruchamianie dzieci na starcie, ale nie w przypadku restartu.