2012-11-05 10 views
5

私は実行中のシステムプロセスへのアクセスを制御するためにAkkaを使用しています。Akkaでは、別の俳優からのメッセージを偽装できますか?

システム内の任意のアクタからの着信コマンド要求(RequestActorと呼ぶことができます)を処理する1つのCommandActorがあり、新しい要求ごとにCommandActorがその特定の要求を処理する別のCmdChildWorkerアクタを生成します。 CommandActorはまた、CmdChildWorkersの数を制限し、各要求に一意のIDを割り当てるため、単純なルーターよりも複雑です。

コマンドが完了し、システムプロセスの実行中に定期的にCmdChildWorkerアクターが定期的な更新を元のRequestActor(たとえばこれまでのプロセス出力)に返します。

しかし、きれいなデザインを維持するために、私は、CmdChildWorkerを元のRequestActorから完全に隠しておきたいと考えていました。

明らかに、私はCommandActor経由でCmdChildWorkerから返信メッセージを送り返すことができましたが、CommandActor経由でメッセージをルーティングしなくてもCmdChildWorkerからRequestActorに直接返信することができるかどうかは疑問でしたメッセージがCommandActorから送り返されていると思われる。

I.e. CmdChildWorkerの俳優の送信者アドレスを親の俳優のアドレスに偽装したいと思います。これは可能ですか?そしておそらくもっと重要なのは、この賢明な、あるいは良い俳優のデザインですか?

おかげ

答えて

9

は俳優のtell方法を参照してください。 CommandActorは、そのメッセージを転送する場合、呼び出し:

childActor.tell(msg, sender)

をしてchildActorは、元の送信者としてその送信者を持つことになります。

+0

おかげルータ、ロードバランサとして働く俳優、リプリケータを書くときに便利です!それはどのように答えます。これが優れた俳優のデザインかどうかについての見解はありますか? –

+0

誰かがいつもより良いものを思いつくことができるので、「良い」と言うのは難しいですが、それは全く悪いとは言えません。実際、これはタイプのない俳優パラダイムの力です。もはやそれが素晴らしいことがなくなるまでそれと一緒に行ってください。 –

+1

アクターのパターンプレゼンテーションのいくつかをチェックアウトする必要があります。別の送信者と 'tell 'を介してワーカーにメッセージを渡すことは、「状態」をトランザクションに結びつけるための非常に一般的な方法です。あなたは基本的に "セッションの状態"を覚えて、彼にすべての情報を渡す俳優を構築します。彼は元のクエリに応答する責任があります。私はそれが良いパターンだと思います:) – jsuereth

4

私はあなたの資格を正しく理解していれば、前向きに使うべきです。ドキュメントから:

メッセージをあるアクタから別のアクタに転送することができます。つまり、メッセージが「メディエータ」を経由していても、元の送信者のアドレス/参照は維持されます。など

myActor.forward(メッセージ)

関連する問題