Акка объединяет несколько списков будущих без блокировки

StackOverflow https://stackoverflow.com/questions/8815741

  •  26-10-2019
  •  | 
  •  

Вопрос

Этот вопрос, вероятно, относительно простым для одного знакомства с будущим 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>>
}

Итак, наконец - мои вопросы -

  1. Как уменьшить вышеупомянутое Future<Future<List<Object>> в Future<List<Object>> Не блокируя, пока Bigboss наконец -то звонит?

  2. Есть ли способ сохранить тип статуса на протяжении всего этого, а не использовать объект? Я знаю, что Untypedactor не может отправить явный типичный ответ, но, возможно, есть более чистый способ выразить это?

  3. Есть ли более элегантный подход к этому полностью, о котором я не думаю? Я использовал последовательность слишком рано, или я не должен был ее использовать вообще?

Я (очевидно) использую 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);
  }
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top