2012-11-13 21 views
6

每當一個actor在scala中接收到一條消息時,我們可以通過使用關鍵字'sender'(這是AbstractActor特性的一個對象)來訪問該actor的發送者。從哪裏我們得到發件人演員時收到一個特定的消息?

我的問題這個'發件人'在收到郵件時變得可以訪問。

還有,我們可以重寫這個實現,其中與發送者一起還可以訪問其他數據,例如ipaddress,數據來自的端口。

據我所知,沒有辦法可以從消息來源的地方獲得ip地址和端口。有什麼辦法可以從這個'發件人'對象獲得發件人和端口號的ip地址?

感謝您的幫助。

+0

如果IP地址是郵件的一部分,那麼將它放入郵件中可能會很好嗎? –

回答

1

在AKKA演員系統中,!被重載爲 def!(message:scala.Any)(implicit sender:akka.actor.ActorRef) 其中sender是發送消息的actor。之後,你可以調用ActorRef的路徑方法,但我認爲你不能從那裏獲得真正的IP地址。

5

(你真的不說哪個演員,所以我假設的答案阿卡是好的爲好)

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 ...你知道如何做這個可以在scala演員嗎?... 感謝您的幫助... – user1822249

+3

我從來沒有使用scola.actors遠程處理,但從我聽到的您可能有興趣查看Akka,這是一個行業認可的解決方案。 scala.actors.remote自2009年7月以來一直沒有被觸及(不包括scala圖書館的重構),所以我認爲可以說它是無人維護的。 –

相關問題