2017-03-29 2 views
2

Dans un superviseur -> modèle enfant acteur où 10 enfants sont créés et le travail est réparti également entre tous les enfants via RoundRobinRoutingLogic. Certains des acteurs sont programmés pour s'arrêter après une certaine durée. Finalement, j'aimerais voir l'état de tous mes enfants acteurs (qu'ils soient vivants ou non). Mais je ne suis pas en mesure de voir une documentation pour cela au sein de ActorRef.Trouver l'état de tous les acteurs enfants dans akka

Voici une partie de ma classe Superviseur:

Router router; 
{ 
    counter = 0; 
    List<Routee> routees = new ArrayList<Routee>(); 
    for (int i = 0; i < 10; i++) { 
     ActorRef r = getContext().actorOf(Props.create(Children.class)); 
     getContext().watch(r); 
     routees.add(new ActorRefRoutee(r)); 
    } 
    router = new Router(new RoundRobinRoutingLogic(), routees); 
} 

est ici la condition au sein de l'acteur enfant qui les amène à arrêter:

if (/*some condition*/) { 
    getContext().parent().tell(new Response(startTime, messages, Status.SUCCESS), getContext().parent()); 
    getContext().stop(getSelf()); 
} 

Quelle est l'API correcte dans la boîte à outils AKKA I pouvez-vous utiliser pour imprimer le statut de tous les acteurs enfants dans ma classe Supervisor?

Répondre

1

Il existe plusieurs façons. D'abord, je vois que vous watch vos routes du superviseur, c'est parce que vous devez enlever des routes du routeur quand elles se terminent. Regarder un acteur signifie que l'observateur (superviseur dans votre cas) recevra un message Terminated(actorRef) lorsqu'un enfant se terminera. Vous pouvez l'utiliser pour gérer votre propre liste d'itinéraires actifs (vous devriez déjà mettre à jour le routeur lors de la réception d'un tel message). Et parce que vous devriez déjà être mise à jour du routeur, vous pouvez toujours interroger ses routées en utilisant router.getRoutees()

En second lieu, la ActorContext offre la méthode getChildren() que vous pouvez utiliser pour énumérer les routées actuellement en vie. Vous pouvez également utiliser le getChild(name) pour vérifier l'état d'un itinéraire spécifique par son nom, mais bien sûr, vous devrez définir un nom pour ceux lors de leur création ...

Troisièmement, vous pouvez créer votre propre protocole où le le superviseur pourrait diffuser un message personnalisé à tous les itinéraires, et les faire répondre avec un autre message. L'inconvénient de cette méthode est que vous devez introduire un certain type de mécanisme de temporisation, car vous ne saurez jamais combien d'itinéraires reçoivent votre message, et en tant que tels, comment les réponses peuvent vous attendre. Je m'arrête ici parce que je pense qu'à moins d'avoir des exigences plus précises, je n'irais pas plus loin que la première solution ci-dessus ... pourquoi réinventer la roue?