Question

Cette question est probablement relativement basique à une familier avec AKKA à terme, donc faire preuve de patience.

En supposant que j'ai une hiérarchie d'Acre acteurs par la structure suivante:

BigBoss                 (one)
|___ExecutiveActor      (one)
    |___ManagerActor    (many)
        |___WorkerActor (many)

Et en supposant que chaque non-BigBoss a l'état interne dans un emballage d'état.

Si le BigBoss devait vouloir un List<Status> de tous les descendants, je peux voir ce qui est la méthode:

// inside BigBoss getAllStatuses
Future<Object> futureStatuses = executive.ask("status", 5000);
List<Status> = (List<Status>)Await.(futureStatuses, timeout);

Et après le message initial se propage à tout le chemin jusqu'à travailleur, je peux voir Worker répondre Manager avec:

getSender().tell(myStatus);

Gestionnaire aurait beaucoup de ces revenir et que vous voulez les mettre dans une liste pour l'exécutif une liste des contrats à terme - la réponse ci-dessus étant en réponse à:

// inside Manager getAllStatuses
List<Future<Object>> statuses =...
for(Worker w : workers) {
   Future<Object> status = w.ask("status", 5000);
   statuses.add(status);
}

Future<List<Object>> futureStatuses = sequence(statuses, ...);
getSender().tell(futureStatuses);

La séquence ci-dessus les premiers convertis à terme dans un Future<List<Object>> (qui a vraiment états dans celui-ci)

C'est donc là que ça commence à être un peu poilu pour moi.

ExecutiveActor avait fait ceci:

for(Manager m : managers) {
   Future<Object> status = m.ask("status", 5000);
   // the above Future would be a Future<Future<List<Object>>
}

Alors, enfin - mes questions -

  1. Comment puis-je réduire le Future<Future<List<Object>> ci-dessus à un Future<List<Object>> sans bloquer jusqu'à ce que BigBoss appelle enfin Attendent?

  2. Est-il possible de conserver le tout au long de ce type de statut plutôt que d'utiliser l'objet? Je sais un UntypedActor ne peut pas envoyer une réponse explicite typée, mais peut-être il y a un moyen de plus propre à exprimer?

  3. Y at-il approche plus élégante à ce tout à fait que je ne pense? Ai-je utilisé Sequence trop tôt, ou devrais-je ne l'ai pas utilisé du tout?

Je suis (évidemment) en utilisant Java - et je préfère ne pas TypedActors d'utilisation, mais aimerait tous les commentaires

Merci beaucoup pour votre temps -

Était-ce utile?

La solution

Quelque chose comme ça?

final ActorRef cacheSender = getSender();
Future<List<Object>> futureStatuses = sequence(statuses, ...);
futureStatuses.onComplete( new Procedure2<Throwable, List<Object>>() {
  public void apply(Throwable t, Object r) {
    if(t != null) cacheSender.tell("ohnoes");
    else cacheSender.tell(r);
  }
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top