0

这个问题对于熟悉 akka Futures 的人来说可能是比较基础的,所以请多多包涵。

假设我按照以下结构有一个 akka 演员层次结构:

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

并假设每个非 BigBoss 在 Status 包装器中都有内部状态。

如果 BigBoss 想要List<Status>来自所有后代,我可以看到这是方法:

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

在初始消息一直传播到 Worker 之后,我可以看到 Worker 回复 Manager:

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

上述序列首先将 Futures 转换为 a Future<List<Object>>(其中确实有状态)

所以这就是我开始有点毛茸茸的地方。

ExecutiveActor 这样做了:

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

所以,最后——我的问题——

  1. 在 BigBoss 最终调用 Await 之前,如何将上述内容减少Future<Future<List<Object>>到没有阻塞的情况?Future<List<Object>>

  2. 有没有办法在整个过程中保留状态类型而不是使用对象?我知道 UntypedActor 无法发送明确的类型化回复,但也许有一种更简洁的方式来表达这一点?

  3. 有没有更优雅的方法完全是我没有想到的?是我太早使用Sequence,还是根本不应该使用它?

我(显然)正在使用 Java - 并且不希望使用 TypedActors,但会喜欢所有反馈!

非常感谢您的宝贵时间-

4

1 回答 1

1

像这样的东西?

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);
  }
});
于 2012-01-11T15:34:44.320 回答