2014-07-26 16 views
5

Ho un attore genitore Akka con diversi bambini. Quando l'attore genitore viene riavviato, ho bisogno di fermarlo semplicemente, piuttosto che fermarlo e ricrearlo o riavviarlo. (Un bambino verrà creato manualmente in seguito, se necessario.) C'è un modo per farlo? Forse sovrascrivendo il metodo preRestart del genitore in qualche modo?Come arrestare semplicemente gli attori figli al riavvio di un genitore?

+0

come si creano i bambini: incondizionatamente durante l'inizializzazione dei genitori o in ricezione? –

+0

@AlekseyIzmailov su ricevere. – Lasf

+0

Sembra che i bambini creati in ricezione (anziché durante l'inizializzazione del genitore) vengano fermati ma non ricreati. Tuttavia, non mi sono convinto di questo. Qualcuno può confermare che questo è il comportamento reale? – Lasf

risposta

3

Per impostazione predefinita, Actor elimina i suoi figli al riavvio. Ecco il codice 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() 
    } 

Come si può vedere genitore si ferma e unwatch suoi figli. È possibile ignorare in questo modo di fare un attore tenerlo vivo per bambini:

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

Così, per gli scopi che non hanno bisogno di ignorare preRestart e avrete comportamento desiderato. Puoi guardare altri callback se desideri avere un comportamento più personalizzato come avviare i bambini all'avvio ma non all'avvio.