对于熟悉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>>
}
所以,最后 - 我的问题 -
在BigBoss最终调用Await之前,如何在不阻塞的情况下将上述Future<Future<List<Object>>
减少到Future<List<Object>>
?
有没有办法在整个过程中保留Status类型而不是使用Object?我知道UntypedActor无法发送明确的类型回复,但也许有一种更清晰的表达方式?
我还没有想到更完美的方法吗?我是否过早使用Sequence,或者我根本不使用它?
我(显然)使用Java - 并且不想使用TypedActors,但是会喜欢所有反馈!
非常感谢你的时间 -
答案 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);
}
});