2012-11-13 6 views
6

Immer wenn ein Akteur eine Nachricht in scala erhält, können wir auf den Absender des Akteurs zugreifen, indem wir ein Schlüsselwort 'sender' verwenden, das ein Objekt des Merkmals AbstractActor ist.Woher bekommen wir den Absender-Akteur, wenn eine bestimmte Nachricht empfangen wird?

Meine Frage, wie wird dieser 'Absender' immer zugänglich, wenn eine Nachricht empfangen wird.

und auch, können wir diese Implementierung überschreiben, wo zusammen mit dem Absender einige andere Daten auch zugänglich sind wie IP-Adresse, Port von dem die Daten kamen.

Soweit ich weiß, gibt es keine Möglichkeit, dass Sie IP-Adresse und Port bekommen von wo die Nachricht gekommen ist .. Gibt es eine Möglichkeit, durch die wir IP-Adresse des Absenders und Port-Nummer von diesem 'Absender' Objekt erhalten können?

Danke für die Hilfe.

+0

Wenn die IP-Adresse ein Teil der Nachricht ist, kann es nett sein, sie in die Nachricht einzufügen? –

Antwort

1

Im AKKA-Aktor-System,! ist überladen als def! (message: scala.Any) (impliziter sender: akka.actor.ActorRef) wobei sender der akteur ist, der die nachricht gesendet hat. Danach können Sie die Pfadmethode auf ActorRef aufrufen, aber ich glaube nicht, dass Sie von dort eine echte IP-Adresse erhalten können.

5

(Du hast wirklich nicht sagen, welche Akteure, so gehe ich davon eine Akka Antwort in Ordnung und ist)

Die sender Methode Sie die ActorRef gibt, die an der Sende Website implizit oder explizit aufgegriffen wurde: Wenn Sie ! innerhalb eines Schauspielers verwenden, wird dessen implicit val self: ActorRef gefunden und verwendet. Wenn das Absender lebt in einem anderen ActorSystem als der Empfänger, dh es sich um eine Remote-Nachricht senden, dann ist die sender ref alle notwendigen Informationen für die Beantwortung enthalten wird, nur Blick auf seinem Weg:

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 

Also, kurz gesagt, sender.path.address.host (und analog für Port) sollte Ihnen geben, was Sie brauchen.

+1

Leider verwende ich nicht akka ... Wissen Sie, wie das in Scala-Darstellern getan werden kann? ... Danke für die Hilfe trotzdem ... – user1822249

+3

Ich habe noch nie mit scala.actors Remoting verwendet, aber von dem, was ich höre Es könnte sein, dass Sie sich für Akka interessieren, es ist eine branchenbewährte Lösung. scala.actors.remote wurde seit Juli 2009 nicht mehr berührt (das generelle scala-Bibliotheks-Refactoring wurde nicht mitgerechnet), ich denke also, es ist fair zu sagen, dass es nicht gepflegt wird. –