2012-11-13 3 views
6

액터가 스칼라에서 메시지를받을 때마다 우리는 특성 AbstractActor의 대상인 '보낸 사람'이라는 키워드를 사용하여 액터의 보낸 사람에게 액세스 할 수 있습니다.특정 메시지를 받았을 때 보낸 사람을 어디에서 얻을 수 있습니까?

내 질문 어떻게 메시지를받을 때마다이 '보낸 사람'이 액세스 할 수있게됩니까?

또한 송신자와 함께 다른 데이터 (예 : ipaddress, 데이터가 들어온 포트)에 액세스 할 수있는이 구현을 재정의 할 수 있습니까?

내가 아는 한, 메시지가있는 곳에서 ipaddress 및 포트를 얻을 수있는 방법은 없습니다.이 '보낸 사람'개체에서 보낸 사람 및 포트 번호의 ipaddress를 얻을 수있는 방법이 있습니까?

도움 주셔서 감사합니다.

+0

IP 주소가 메시지의 일부인 경우 메시지에 입력하는 것이 좋을 수도 있습니다. –

답변

1

AKKA 배우 시스템에서! def! (message : scala.Any) (암시 적 보낸 사람 : akka.actor.ActorRef) 여기서 sender는 메시지를 보낸 액터입니다. 그 후에 ActorRef에 대한 경로 메서드를 호출 할 수는 있지만 실제 IP 주소를 얻을 수는 없을 것이라고 생각합니다.

5

(당신은 정말 배우 말하지 않았다, 그래서 내가 Akka 응답뿐만 아니라 괜찮 겠지)

sender 방법은 당신에게 암시 적 또는 명시 적으로 전송 사이트에서 채취했다 ActorRef을 제공합니다 : 액터 내에서 !을 사용하는 경우 해당 implicit val self: ActorRef이 발견되어 사용됩니다. 그것은 원격 메시지 보내기입니다 즉, 수신자는 다른 ActorSystem에서 해당 보낸 사람의 삶, 다음 sender 심판 회신에 필요한 모든 정보를 포함 할 경우, 단지 그 경로를 보면 :

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 월부터 다루지 ​​않았습니다 (일반적인 스칼라 라이브러리 리팩터링을 포함하지 않음), 그것이 유지되지 않는다고 말하는 것이 공평하다고 생각합니다. –