2013-01-12 8 views
6

私のアプリケーションは、アクターのツリー構造を作成できる必要があります。これを行う標準的な方法は、インスタンス化コードをアクタの内部に配置して、子をインスタンス化できるようにすることです。私はむしろ、与えられたパスでアクターをインスタンス化することができると考えています。たとえば、mySystemにアクタAを作成し、次にakka:// mySystem/A/Bと他のアクタを直接作成することができます。そのような機能は存在しますか?それは私のコードを大幅に簡素化します。akkaでアクター階層を手動で作成する

編集:私は自分の電話にはいないので、詳しく教えてください。

は、私はクラス

class myActor extends actor 

を持っていると言うと、私はこれらのnウェイ・ツリーを作成する必要があります。代わりに

case Create(n:Int) => {} 

ようなもので受け取る機能で自分の子供をインスタンス化するために必要なコードを有していると私はそれのいずれかを含む、代わりに開始時に自分の階層を作成することができないことでmyActorコードを簡素化するために探しています手動で私のコードの。理想的には、この(「作成」架空の静的関数を仮定して)のようなもの:俳優ツリーを作成します

val sys = ActorSystem("mySystem") 
Akka.Actors.Create("akka://mySystem/a", new myActor()) 
Akka.Actors.Create("akka://mySystem/a/b", new myActor()) 
Akka.Actors.Create("akka://mySystem/a/c", new myActor()) 

a 
/\ 
b c 

、これは存在しませんか?インスタンス化コードで自分のアクターコードを乱雑にしないでこれを行うより良い方法はありますか?

EDIT、ラウンド2

いいえ、この機能は存在しないようです。私は代わりに、俳優のサブクリットを作成し、そこにすべてのインスタンス化コードを強制して、私の具体的な実装クラスがまだきちんと整っているようにしました。

答えて

2

すべてのアクタには親があります。必要な処理を行うには、Actorクラスが、他のすべてのアクター(ルートアクター以外)の親として機能する必要があります。親の俳優は俳優を監督することと同義であるため、それらの親の俳優に適用する監督戦略を指示する手段が必要です。

アクター階層の内部位置に配置するために汎用の親Actorを定義し、アクターのパス名を分解し、それらのパスの1つ以上によって指示される階層を作成するメソッドを記述するとします。あなたはおそらく監督戦略を指定する方法、そして最小限にはreceive関数をリーフ俳優にインストールすることを望むでしょう。

俳優だけが子を作ることができるので、親アクターは子アクター(他の親アクターまたは葉アクターのいずれか)を作成するためのメッセージに応答しなければなりません。Actorサブクラスをインスタンス化する方法を選択する方法があります。葉の俳優。

しかし、あなたの質問に答えるには、これを行うための組み込みはありません。私はそれがAkka自身にそれを加えることを正当化するのに十分な一般的な有用性を持っているとは思わない。

2

ルートアクター内からルートアクターを作成し、actorForでツリーを作成します。名前の階層構造を静的に設定するには、クラスパスにapplication.confを使用するか、またはアドレスの一定の構造を作成します。他のオプションはパスを解析し、オーバーライドされた子をpreStartで作成します。子供のライフサイクルを監督するためのさまざまなスキームがあり、再起動してメッセージを単一のアクタを通して透過的にルーティングします。

4

あなたの質問は、ソリューションの仮定から始まりますが、残念ながら問題の説明は含まれていません。

俳優ツリーは主に監督階層と理解されるべきである。親は子供の失敗を処理し、親のライフサイクルは子供のライフサイクルの境界にある。俳優が他者の子供であるべきかどうかは、これらの意味を考慮して決定する必要があります。

あなたの質問は、他の基準に従って監督ツリーをモデル化していることを意味しているため、ルックアップメカニズムとしてsystem.actorForのレジストリとして誤用する可能性があります。それがうまくいくことはまれであるかもしれませんが、先験的に私はそれをお勧めしません。私は、ディスパッチャーの俳優の中にハッシュマップを置いて、ルックアップを処理したいと思う。測定が十分ではないと判断した場合は、routerを使用してスケールアップすることができます。

あなたの質問に今答えるには、それぞれの親が独自の子を作成する必要があります。つまり、それを行うためのコードが何らかの形で含まれている必要があります。階層の下にPropsを渡して、その部分を構成可能にすることができますが、what supervision meansを回避する必要はありません。葉の1つが失敗した場合にどうなるべきかを自問し、中間の俳優が再開されたときにあなたの推定葉を再開しなければならないかどうか自問してください。

+0

理論的にはこれは良い答えですが、スパゲッティコードが大規模な俳優システムの階層からどのくらいの割合で発生しているかを知ることはできません。この質問に記載された中心的な構成は、実際のソフトウェア目的のために全体的な階層を明確に理解するための仕組みを提供するかもしれない。複雑な階層を明確にするための代替方法をお勧めしますか?または、親子関係の関係をどのように与えなければならないのでしょうか? –

+0

私が持っていない文脈を暗示しているように思われるので、私はこれに答えることは難しいです。アクターシステムは、特定の機能を提供するサブツリーで構成されています。その意味で、アクターシステムは非常にモジュラーです。これらのサブモジュールのそれぞれへのエントリポイントは、そのトップアクターであり、実質的にそのサブツリー全体である。私は外部からサブツリー内にアクターをインストールしようとすることでこのモデルを壊すことでスパゲッティコードが生成されるのを見ることができます。アクタが子を作成する必要があるときはいつでも、それを行う方法を決定するためにconfigを見ることができます。 –

関連する問題