6

每当一个actor在scala中接收到消息时,我们可以通过使用关键字'sender'来访问actor的发送者,它是一个特征AbstractActor的对象。

我的问题是,每当收到消息时,如何才能访问此“发件人”。?

而且,我们是否可以覆盖这个实现,与发送者一起,其他一些数据也可以访问,例如 ipaddress,数据来自的端口。

据我所知,您无法从消息的来源处获取 IP 地址和端口。有什么方法可以从这个“发件人”对象中获取发件人的 IP 地址和端口号?

谢谢您的帮助。

4

2 回答 2

6

(您并没有真正说出哪些演员,所以我假设 Akka 的答案也可以)

sender方法为您提供ActorRef了在发送站点隐式或显式拾取的内容:如果您!在演员中使用,implicit val self: ActorRef则会找到并使用它。如果该发件人与收件人居住在不同ActorSystem的地方,即它是远程消息发送,则senderref 将包含回复所需的所有信息,只需查看其路径:

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(和端口的模拟)应该给你你需要的东西。

于 2012-11-15T09:51:13.930 回答
1

在 AKKA 演员系统中,!被重载为 def !(message : scala.Any)(implicit sender : akka.actor.ActorRef) 其中 sender 是发送消息的参与者。之后,您可以在 ActorRef 上调用 path 方法,但我认为您无法从那里获得真实的 IP 地址。

于 2012-11-14T10:26:33.607 回答