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?
5
A
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.
w jaki sposób tworzysz dzieci: bezwarunkowo podczas inicjowania przez rodzica lub podczas odbierania? –
@AlekseyIzmailov On receive. – Lasf
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