0

この質問は、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);

そして、最初のメッセージがワーカーにまで伝搬された後、ワーカーがマネージャーに次のように返信しているのがわかります。

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 を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 が最終的に Await を呼び出すまで、ブロックせずに上記Future<Future<List<Object>>を aに減らすにはどうすればよいですか?Future<List<Object>>

  2. オブジェクトを使用するのではなく、これを通して Status タイプを保持する方法はありますか? UntypedActor が明示的な型指定された応答を送信できないことは知っていますが、おそらくこれを表現するよりクリーンな方法はありますか?

  3. 私が考えていない、これ以上のエレガントなアプローチはありますか? Sequence を使用するのが早すぎましたか、それともまったく使用すべきではありませんでしたか?

私は (明らかに) Java を使用しています - TypedActors を使用したくないのですが、すべてのフィードバックを歓迎します!

お時間をいただきありがとうございました-

4

1 に答える 1

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);
  }
});
于 2012-01-11T15:34:44.320 に答える