Акка объединяет несколько списков будущих без блокировки
Вопрос
Этот вопрос, вероятно, относительно простым для одного знакомства с будущим Akka, поэтому, пожалуйста, терпите меня.
Предполагая, что у меня есть иерархия актеров Akka в соответствии с следующей структурой:
BigBoss (one)
|___ExecutiveActor (one)
|___ManagerActor (many)
|___WorkerActor (many)
И предполагая, что каждый не-бигбосс имеет внутреннее состояние в обертке статуса.
Если бы Bigboss хотел List<Status>
От всех потомков я вижу это метод:
// inside BigBoss getAllStatuses
Future<Object> futureStatuses = executive.ask("status", 5000);
List<Status> = (List<Status>)Await.(futureStatuses, timeout);
И после того, как первоначальное сообщение распространяется до конца до работника, я вижу, как работник отвечает менеджеру с:
getSender().tell(myStatus);
У менеджера будет много из них, и они захотят поместить их в список для исполнительной власти в качестве списка будущих - приведенный выше ответ в ответ на:
// 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);
Приведенная выше последовательность сначала преобразует будущее в Future<List<Object>>
(который действительно имеет статусы в нем)
Так что это то, где он начинает становиться немного волосатым для меня.
Руководитель сделал это:
for(Manager m : managers) {
Future<Object> status = m.ask("status", 5000);
// the above Future would be a Future<Future<List<Object>>
}
Итак, наконец - мои вопросы -
Как уменьшить вышеупомянутое
Future<Future<List<Object>>
вFuture<List<Object>>
Не блокируя, пока Bigboss наконец -то звонит?Есть ли способ сохранить тип статуса на протяжении всего этого, а не использовать объект? Я знаю, что Untypedactor не может отправить явный типичный ответ, но, возможно, есть более чистый способ выразить это?
Есть ли более элегантный подход к этому полностью, о котором я не думаю? Я использовал последовательность слишком рано, или я не должен был ее использовать вообще?
Я (очевидно) использую Java - и предпочел бы не использовать TypedActors, но хотел бы все отзывы!
Спасибо вам большое за ваше время-
Решение
Что-то вроде этого?
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);
}
});