【问题标题】:akka combining multiple lists of futures without blockingakka 组合多个期货列表而不会阻塞
【发布时间】:2012-01-11 07:37:12
【问题描述】:

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

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

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

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

如果 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 转换为 Future&lt;List&lt;Object&gt;&gt;(其中确实有状态)

所以这就是我开始有点毛骨悚然的地方。

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&lt;Future&lt;List&lt;Object&gt;&gt; 减少为 Future&lt;List&lt;Object&gt;&gt; 而不会阻塞?

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

  3. 有没有更优雅的方法来完全解决这个问题,我没有想到?是我用的太早了,还是根本没用过?

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

非常感谢您的宝贵时间-

【问题讨论】:

    标签: java akka future


    【解决方案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);
      }
    });
    

    【讨论】:

    • 维克多,这很成功。我最初试图让顶级 BigBoss 管理从 Object 到 TypedObject 的转换,但这种方法让我可以在 Procedure 中完成它,并且它更易于测试。谢谢!
    猜你喜欢
    • 2018-06-11
    • 2016-04-11
    • 2015-11-08
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2019-02-23
    相关资源
    最近更新 更多