2012-11-13 10 views
6

Ilekroć aktor otrzymuje wiadomość w scala, możemy uzyskać dostęp do nadawcy aktora za pomocą słowa kluczowego "nadawca", który jest obiektem cechowym AbstractActor.Skąd otrzymujemy aktora nadawcy po odebraniu konkretnej wiadomości?

Moje pytanie: w jaki sposób ten "nadawca" staje się dostępny po otrzymaniu wiadomości?

, a także, czy możemy zastąpić tę implementację, gdy wraz z nadawcą dostępne są również inne dane, takie jak ipaddress, port, z którego pochodzą dane.

O ile mi wiadomo, nie ma możliwości pobrania adresu i adresu z miejsca, z którego pochodzi wiadomość. Czy istnieje sposób uzyskania adresu i adresu nadawcy i numeru portu z tego obiektu "nadawcy"?

Dzięki za pomoc.

+0

Jeśli adres IP jest częścią wiadomości, może być fajnie umieścić go w wiadomości? –

Odpowiedz

1

W systemie aktorów AKKA,! jest przeciążony jako def! (wiadomość: scala.Any) (niejawny nadawca: akka.actor.ActorRef) gdzie nadawca jest aktorem, który wysłał wiadomość. Następnie możesz wywołać metodę ścieżki na ActorRef, ale nie sądzę, że będziesz w stanie uzyskać prawdziwy adres IP.

5

(Ty naprawdę nie powiedzieć, który aktorów, więc jestem przy założeniu odpowiedzią Akka jest w porządku, jak również)

Sposób sender daje ActorRef który był pośrednio lub bezpośrednio odebrać w miejscu wysyłającego: jeśli użyjesz ! wewnątrz aktora, zostanie znaleziony i użyty jego numer implicit val self: ActorRef. Jeśli który żyje nadawcę w innym ActorSystem niż odbiorcy, czyli jest to zdalne wyślij wiadomość, a następnie sender ref będzie zawierał wszystkie informacje niezbędne do udzielenia odpowiedzi, wystarczy spojrzeć na jego drodze:

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 

Tak, w skrócie, sender.path.address.host (i analogowe dla portu) powinno dać ci to, czego potrzebujesz.

+1

Niestety nie używam akka ... Czy wiesz, jak to zrobić u aktorów scala? ... Dzięki za pomoc w każdym razie ... – user1822249

+3

Nigdy nie używałem zdalnego połączenia z scala.actors, ale z tego co słyszę być może zainteresuje Cię Akka, jest to sprawdzone rozwiązanie. scala.actors.remote nie została dotknięta od lipca 2009 r. (nie licząc ogólnego refakturowania bibliotek scala), więc uważam, że uczciwie jest powiedzieć, że jest ona bez opieki. –

Powiązane problemy