Domanda

Penso che potrebbe esserci una questione più ampia di progettazione dell'applicazione che utilizza Akka nascosta qui, ma chiederò come si crea un albero di supervisione in cui un supervisore "kernel" o "top" potrebbe supervisionare i bambini che sono altri supervisori quali operatori del supervisore?

È stato utile?

Soluzione

Potresti iniziare con un supervisore dichiarativo al livello superiore

 val kernel = Supervisor(
     SupervisorConfig(
         OneForOneStrategy(List(classOf[Exception]), 3, 1000),
         Supervise(
             actorOf[Module1],
             Permanent) ::
         Supervise(
             actorOf[Module2],
             Permanent) ::
         Supervise(
             actorOf[Module3],
             Permanent) ::
         Nil
     )
 )

dove il modulo da 1 a 3 rappresenta il livello successivo dell'architettura dell'applicazione. Ogni modulo stesso è un supervisore per tutti i propri attori e implementato come ad esempio

class Module1 extends Actor {
   self.faultHandler = OneForOneStrategy(List(classOf[Throwable]), 5, 5000)

   def receive = {
       case Register(actor) =>
       self.link(actor)
   }
}

Potresti sostituire il messaggio "Registra (attore)" con qualcosa di più adatto alla tua applicazione e potresti voler abbracciare un ulteriore livello di supervisore creato a livello di programmazione, ma in sostanza sarebbe l'approccio da seguire.

Troverai ulteriori dettagli (come ha già commentato Viktor) nella documentazione ufficiale di Akka su Tolleranza agli errori con scala o Tolleranza agli errori con Java.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top