【发布时间】: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<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 无法发送明确的类型化回复,但也许有更简洁的方式来表达这一点?
有没有更优雅的方法来完全解决这个问题,我没有想到?是我用的太早了,还是根本没用过?
我(显然)正在使用 Java - 并且不希望使用 TypedActors,但希望得到所有反馈!
非常感谢您的宝贵时间-
【问题讨论】: