2012-11-13 3 views
6

アクターがscalaでメッセージを受信するたびに、特性AbstractActorのオブジェクトであるキーワード 'sender'を使用して、アクターの送信者にアクセスできます。特定のメッセージが受信されたときに送信者の俳優がどこから来るのですか?

私の質問メッセージが届くと、この「送信者」はどのようにアクセス可能になりますか?

この送信をオーバーライドすることもできます。送信者とともに、ipaddress、データが送信されたポートなどの他のデータにもアクセスできます。

私が知る限り、メッセージが来た場所からipaddressとportを取得する方法はありません。この '送信者'オブジェクトから送信者とポート番号のipaddressを取得する方法はありますか?

ありがとうございました。

+0

IPアドレスがメッセージの一部である場合、それをメッセージに入れていいかもしれませんか? –

答えて

1

AKKAアクターシステムでは、! def!(message:scala.Any)(暗黙の送信者:akka.actor.ActorRef) ここで、senderはメッセージを送信したアクタです。その後、ActorRefのpathメソッドを呼び出すことができますが、そこから実際のIPアドレスを取得することはできません。

5

(あなたは本当に俳優言わなかったので、私はアッカの答えは、同様大丈夫ですと仮定しています)

sender方法はあなたに暗黙的または明示的に送信するサイトで拾ったActorRefを与えます:アクター内で!を使用すると、implicit val self: ActorRefが見つかって使用されます。それは、リモートメッセージ送信、すなわち受信者とは異なるActorSystemでその送信者の生活は、その後、sender refは返信のために必要なすべての情報が含まれる場合は、単にそのパスを見て:

val s = sender // Actor[akka://<system>@<host>:<port>/user/path/to/actor] 
val p = s.path // akka://<system>@<host>:<port>/user/path/to/actor 
val a = p.address // akka://<system>@<host>:<port> 
val host = a.host // Some(<host>), where <host> is the listen address as configured for the remote system 
val port = a.port // Some(<port>), where <port> is the actual listen port of the remote system 

だから、要するに、 sender.path.address.host(およびポートのアナログ)は、必要なものを提供します。

+1

残念ながら私はakkaを使用していません...スカラーの俳優でこれがどのように行われるのか知っていますか... 助けてくれてありがとうと思います... – user1822249

+3

私はscala.actorsでリモーティングを使ったことはありませんでした。 Akkaを調べることに興味があるかもしれませんが、業界で実証済みのソリューションです。 scala.actors.remoteは2009年7月以降は触れられていません(一般的なスカラーライブラリのリファクタリングは含まれていません)ので、それは維持されていないと言えると思います。 –

関連する問題