2012-11-13 5 views
6

Ogni volta che un attore riceve un messaggio in scala, è possibile accedere al mittente dell'attore utilizzando una parola chiave "mittente" che è un oggetto di carattere AbstractActor.Da dove riceviamo l'attore mittente quando viene ricevuto un particolare messaggio?

La mia domanda in che modo questo "mittente" diventa accessibile ogni volta che viene ricevuto un messaggio.?

e inoltre, è possibile eseguire l'override di questa implementazione in cui, insieme al mittente, sono accessibili anche altri dati quali indirizzoip, porta da cui provengono i dati.

Per quanto ne so, non è possibile ottenere ipaddress e port da dove è arrivato il messaggio. Esiste un modo per ottenere l'indirizzo ip del mittente e il numero di porta da questo oggetto "mittente"?

Grazie per l'aiuto.

+0

Se l'indirizzo IP è una parte del messaggio, potrebbe essere utile inserirlo nel messaggio? –

risposta

1

Nel sistema di attori AKKA,! è sovraccaricato come def! (messaggio: scala.Any) (mittente implicito: akka.actor.ActorRef) dove il mittente è l'attore che ha inviato il messaggio. Dopodiché puoi chiamare il metodo path su ActorRef, ma non credo che sarai in grado di ottenere un vero indirizzo IP da lì.

5

(Non hai veramente detto che gli attori, quindi sto assumendo una risposta Akka va bene così)

Il metodo sender ti dà la ActorRef che era implicitamente o esplicitamente ritirati presso il sito di invio: se si utilizza ! all'interno di un attore, viene trovato e utilizzato il suo implicit val self: ActorRef. Se che vive mittente in un diverso ActorSystem rispetto al destinatario, vale a dire che è un messaggio di invio a distanza, poi l'arbitro sender conterrà tutte le informazioni necessarie per rispondere, basta guardare il suo percorso:

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 

Così, in breve, sender.path.address.host (e analogico per porta) dovrebbero darti quello che ti serve.

+1

Sfortunatamente non sto usando Akka ... Sai come si può fare in scala attori? ... Grazie per l'aiuto comunque ... – user1822249

+3

Non ho mai usato il remoting con scala.actors, ma da quello che sento potresti essere interessato ad esaminare Akka, è una soluzione collaudata nel settore. scala.actors.remote non è stato toccato dal luglio 2009 (senza contare il refactoring generale della scala scala), quindi penso che sia giusto dire che non è mantenuto. –

Problemi correlati