2016-04-18 20 views
2

Ich versuche, einen Akka Actor zu überwachen, genauer gesagt eine Cluster Singleton erstellt mit ClusterSingletonManager. Ich versuche, mehr Kontrolle über Ausnahmen, Protokolle und Actors Lebenszyklus zu erreichen.Wie überwacht man Cluster Singleton in Akka?

Leider habe ich nach der Implementierung einer Lösung einen Singleton-Actor ausgelöst Ausnahmen, aber nichts wurde in den Protokollen angezeigt, noch der Actor oder Cluster wurde heruntergefahren.

Meine Implementierung ist wie folgt:

object SingletonSupervisor { 
    case class CreateSingleton(p: Props, name: String) 
} 

class SingletonSupervisor extends Actor with ActorLogging { 
    override val supervisorStrategy = 
    OneForOneStrategy(maxNrOfRetries = 0, withinTimeRange = 1.minute) { 
     case x: ActorInitializationException => 
     log.error(s"Actor=<${x.getActor}> trowed an exception=<${x.getCause}> with message=<${x.getMessage}>") 
     Stop 

     case x: ActorKilledException => Stop 

     case x: DeathPactException => Stop 

     case x: Exception => 
     log.error(s"Some actor threw an exception=<${x.getCause}> with message=<${x.getMessage}>, trace=<${x.getStackTrace}>") 
     Escalate 
    } 

    def receive = { 
    case CreateSingleton(p: Props, name: String) => 
     sender() ! context.actorOf(p) 
     context.actorOf(ClusterSingletonManager.props(
     singletonProps = p, 
     terminationMessage = PoisonPill, 
     settings = ClusterSingletonManagerSettings(context.system)), 
     name = name) 
    } 
} 

So ist es sogar möglich, Supervisor ein Cluster Singlegon? Wenn möglich, wie soll ich dieses Problem angehen?

Antwort

1

Eine mögliche Lösung ist die Erstellung eines Supervisor-Aktors, der ein gegebenes Kind mit supervisorStrategy erzeugt und Nachrichten an sein Kind weiterleitet.

Hier ist Supervisor Schauspieler:

class SupervisorActor(childProps: Props, override val supervisorStrategy) extends Actor { 

    val child = context.actorOf(childProps, "supervised-child") 

    def receive: Receive = { 
    case msg => child forward msg 
    } 
} 

und hier ist, wie Sie beaufsichtigten Schauspieler als Cluster Singletons

context.actorOf(ClusterSingletonManager.props(
     singletonProps = Props(classOf[SupervisorActor], p, supervisorStrategy), 
     terminationMessage = PoisonPill, 
     settings = ClusterSingletonManagerSettings(context.system)), 
     name = name) 
+0

Thank schaffen, ich diese Lösung beendet werden. Aber es lässt immer noch nicht zu, alle Schauspielerbäume vollständig zu überwachen. – yamilife

Verwandte Themen