2012-01-11 3 views
0

この質問は、おそらくakka先物に精通している方にとって比較的基本的なものですので、私にご負担ください。akkaブロッカーなしで先物の複数のリストを結合する

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); 

、初期メッセージがダウン労働者へのすべての方法に伝播された後、私は労働者を見ることができますマネージャーへの返信:

getSender().tell(myStatus); 

Managerは、これらの多くは戻って来ており、先物のリストとしてエグゼクティブのためのリストに入れたいと思う - 上記の回答はに対応している:

// 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が最終的に待って呼び出すまでブロックせずにFuture<List<Object>>に上記Future<Future<List<Object>>を減らすのですか?

  2. Objectを使用するのではなく、これを通じてステータスタイプを保持する方法はありますか?私はUntypedActorが明示的な型付きの返信を送ることができないことを知っていますが、これを表現するためのより洗練された方法がありますか?

  3. 私が考えていないこれ以上の優雅なアプローチはありますか?あまりにも早くシーケンスを使用しましたか、まったく使用してはいけませんか?

私は(明らかに)Javaを使用していますが、TypedActorsを使用しない方がいいですが、すべてのフィードバックが大好きです!

ありがとうございます。

答えて

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); 
    } 
}); 
+0

これは非常にうまくいきました。私はもともとトップレベルのBigBossでObjectからTypedObjectへのキャストを管理しようとしていましたが、このアプローチではプロシージャでそれをやり直すことができました。ありがとう! –

関連する問題