Frage

Diese Frage ist wahrscheinlich relativ grundlegend für eine, die mit Akka -Futures vertraut ist, also bitte mit mir.

Angenommen, ich habe eine Hierarchie von Akka -Schauspielern gemäß der folgenden Struktur:

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

Und vorausgesetzt, jeder Nicht-Bigboss hat einen internen Zustand in einer Statusverpackung.

Wenn die Bigboss a wollen würden List<Status> Von allen Nachkommen kann ich sehen, dass dies die Methode ist:

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

Und nachdem die erste Nachricht bis zum Arbeiter auf den Arbeiter verbreitet wurde, kann ich den Worker auf den Manager beantworten, mit:

getSender().tell(myStatus);

Manager würde viele davon zurückkommen und sie als Liste der Futures in eine Liste für die Exekutive bringen - die obige Antwort lautet als Antwort auf:

// 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);

Die obige Sequenz wandelt zuerst die Zukunft in a um Future<List<Object>> (was wirklich Status im IT hat)

Hier wird es also ein bisschen haarig für mich.

Der Executiveactor hatte dies getan:

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

Also endlich - meine Fragen -

  1. Wie reduziere ich die oben genannten? Future<Future<List<Object>> zu einem Future<List<Object>> Ohne zu blockieren, bis Bigboss endlich aufruft?

  2. Gibt es eine Möglichkeit, den Statustyp in diesem Bereich zu behalten, anstatt Objekt zu verwenden? Ich weiß, dass ein Untypedactor keine explizit getippte Antwort senden kann, aber vielleicht gibt es eine sauberere Möglichkeit, dies auszudrücken?

  3. Gibt es noch einen eleganteren Ansatz dafür, an das ich nicht denke? Habe ich Sequenz zu früh verwendet oder hätte ich sie überhaupt nicht benutzt haben?

Ich verwende (offensichtlich) Java - und würde es vorziehen, Typedaktoren nicht zu verwenden, aber würde alle Feedback lieben!

Vielen Dank für Ihre Zeit-

War es hilfreich?

Lösung

Etwas wie das?

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);
  }
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top