Pregunta

Esta pregunta es probablemente relativamente básica para uno familiarizado con Akka Futures, así que por favor tengan paciencia conmigo.

Suponiendo que tengo una jerarquía de actores de Akka según la siguiente estructura:

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

Y suponiendo que cada no bigboss tenga estado interno en un envoltorio de estado.

Si el Bigboss quisiera un List<Status> De todos los descendientes, puedo ver que este es el método:

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

Y después de que el mensaje inicial se propaga hasta el trabajador, puedo ver al trabajador responder al gerente con:

getSender().tell(myStatus);

El gerente tendría muchos de estos volver y querer ponerlos en una lista para el ejecutivo como una lista de futuros, la respuesta anterior es en respuesta a:

// 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 secuencia anterior primero convierte los futuros en un Future<List<Object>> (que realmente tiene estados)

Así que aquí es donde comienza a ponerse un poco peludo para mí.

EjecutiveActor había hecho esto:

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

Entonces, finalmente, mis preguntas -

  1. ¿Cómo reduzco lo anterior? Future<Future<List<Object>> a un Future<List<Object>> ¿Sin bloquear hasta que Bigboss finalmente llame?

  2. ¿Hay alguna forma de retener el tipo de estado a lo largo de esto en lugar de usar objeto? Sé que un sin typedactor no puede enviar una respuesta escrita explícita, pero ¿tal vez hay una forma más limpia de expresar esto?

  3. ¿Hay algún enfoque más elegante para esto por completo en lo que no estoy pensando? ¿Usé secuencia demasiado temprano o no debería haberla usado en absoluto?

Estoy (obviamente) usando Java, y preferiría no usar TypeDactors, ¡pero me encantaría todos los comentarios!

Muchas gracias por tu tiempo-

¿Fue útil?

Solución

¿Algo como esto?

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);
  }
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top