Acre combinant plusieurs listes de contrats à terme sans bloquer
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 -
-
Comment puis-je réduire le
Future<Future<List<Object>>
ci-dessus à unFuture<List<Object>>
sans bloquer jusqu'à ce que BigBoss appelle enfin Attendent? -
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?
-
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 -
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);
}
});