akka结合了多个期货清单而没有阻止

时间:2012-01-11 07:37:12

标签: java akka future

对于熟悉akka期货的人来说,这个问题可能比较基本,所以请耐心等待。

假设我有以下结构的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);

以上序列首先将期货转换为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. 有没有办法在整个过程中保留Status类型而不是使用Object?我知道UntypedActor无法发送明确的类型回复,但也许有一种更清晰的表达方式?

  3. 我还没有想到更完美的方法吗?我是否过早使用Sequence,或者我根本不使用它?

  4. 我(显然)使用Java - 并且不想使用TypedActors,但是会喜欢所有反馈!

    非常感谢你的时间 -

1 个答案:

答案 0 :(得分: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);
  }
});