这个问题对于熟悉 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>>
}
所以,最后——我的问题——
在 BigBoss 最终调用 Await 之前,如何将上述内容减少
Future<Future<List<Object>>
到没有阻塞的情况?Future<List<Object>>
有没有办法在整个过程中保留状态类型而不是使用对象?我知道 UntypedActor 无法发送明确的类型化回复,但也许有一种更简洁的方式来表达这一点?
有没有更优雅的方法完全是我没有想到的?是我太早使用Sequence,还是根本不应该使用它?
我(显然)正在使用 Java - 并且不希望使用 TypedActors,但会喜欢所有反馈!
非常感谢您的宝贵时间-