ブロッキングせずに未来の複数のリストを組み合わせるAkka
質問
この質問は、おそらくAkka Futuresに精通している人にとっては比較的基本的なものなので、私に耐えてください。
次の構造に従って、Akka俳優の階層があると仮定します。
BigBoss (one)
|___ExecutiveActor (one)
|___ManagerActor (many)
|___WorkerActor (many)
そして、各非ビグボスがステータスラッパーに内部状態を持っていると仮定します。
Bigbossがaを望んでいた場合 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);
上記のシーケンスは、最初に先物を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>>
}
だから、最後に - 私の質問 -
上記を減らすにはどうすればよいですか
Future<Future<List<Object>>
にFuture<List<Object>>
Bigbossが最終的に待っているまでブロックせずに?オブジェクトを使用するのではなく、これ全体でステータスタイプを保持する方法はありますか? Untypedactorが明示的なタイプの返信を送信できないことは知っていますが、おそらくこれを表現するよりクリーンな方法がありますか?
私が考えていないというこれに対するこれ以上のエレガントなアプローチはありますか?シーケンスを早すぎて使用しましたか、それともまったく使用していなかったのですか?
私は(明らかに)Javaを使用しています - そして、タイプ編集者を使用したくないが、すべてのフィードバックが大好きです!
どうもありがとうございました -
解決
このようなもの?
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);
}
});