2012-08-05 6 views
16

私はアクカを学んでいると私は俳優がお互いに話をする方法を把握しようとしている(ABと呼ぶ)。要求/応答のシナリオではなく、ABはいつでも互いにメッセージを送信しています。アクターactorFor対ActorRefを渡す対

現時点では、私はお互いに両方向にメッセージを渡す2つの兄弟俳優を持っています。それらはともにActorSystemに直接作成されています。私は最初AActorRefBのコンストラクタに渡しました。しかし、BActorRefAのコンストラクタに渡すことはできません。まだ存在しない、つまりこのメソッドを循環参照に使用できないためです。

私はactorForについて読んできました。これは、そのパスを使って俳優を見てみましょう。しかし、私はこの設定に慣れていません。なぜなら、パスが変更された場合、コンパイラーはそれを捕まえないからです。

もう一つの選択肢は、すべての俳優を考慮すると、その親へのアクセス権を持っている、親にABからのメッセージを渡し、その後、親が戻ってダウンABへのメッセージを渡すことです。しかし、これは、前後に渡されるメッセージタイプに親を結合します。

俳優同士が互いを意識させる戦略は何ですか?私はパスで俳優を探すのには慎重すぎるのですか?

+0

'ActorRef'sをインスタンス化するときに' lazy val'sを使ってみましたか?私はこれが循環依存を解決するのに役立つだろうと想像することができます。 Scalaを使うと仮定すると... – agilesteel

+0

私はちょうどそれを行って、それは動作します。私はあなたが定義される前に怠け者の言葉を参照するのを知らなかった - クレイジーなもの!先端に感謝します。私は、ActorRefsとパスを渡すことについて人々がどのように感じているかを知ることにはまだ興味があります。 – Geoff

+0

http://doc.akka.io/docs/akka/2.0.2/general/addressing.htmlを必ず読んでください。 – sourcedelica

答えて

11

あなたは私があなたの問題に近いからリストの3つの戦略、持っている私の謙虚な意見では(最悪のパターンだけでなく、私には、私は申し訳ありません)

戦略1:あなたは俳優Aおよび俳優のBを作成し、 actorRef AをアクタBのコンストラクタに渡します。あなたのピンポンは、アクタBがアクタAにメッセージを送信することから始まり、アクタAは送信者参照を使用して簡単に応答できます。 (またはその逆)


戦略2:あなたは、命名の世話をアプリケーション内のレイヤーを作成します。それは俳優の作成時に名前を割り当て、同様に問い合わせるとき。これにより、問題が一箇所に集中します。


戦略3:ピンポンを再生する2人の兄弟の俳優は、基本的に、それぞれの俳優が彼の親と自分の子供たちとのみ通信し、彼の兄弟についての知識がないより良い、より多くのモジュラー俳優階層を交換しない場合は、疑問に思います。

+3

戦略3が最も賢明に聞こえる。私は両親がたくさんの配線をやろうとしていることをちょっと心配していましたが、子どもを調整するのは親の仕事であるため、大丈夫です(メッセージを転送するだけではあまり効果がありません)。 – Geoff

関連する問題