每当一个actor在scala中接收到消息时,我们可以通过使用关键字'sender'来访问actor的发送者,它是一个特征AbstractActor的对象。
我的问题是,每当收到消息时,如何才能访问此“发件人”。?
而且,我们是否可以覆盖这个实现,与发送者一起,其他一些数据也可以访问,例如 ipaddress,数据来自的端口。
据我所知,您无法从消息的来源处获取 IP 地址和端口。有什么方法可以从这个“发件人”对象中获取发件人的 IP 地址和端口号?
谢谢您的帮助。
每当一个actor在scala中接收到消息时,我们可以通过使用关键字'sender'来访问actor的发送者,它是一个特征AbstractActor的对象。
我的问题是,每当收到消息时,如何才能访问此“发件人”。?
而且,我们是否可以覆盖这个实现,与发送者一起,其他一些数据也可以访问,例如 ipaddress,数据来自的端口。
据我所知,您无法从消息的来源处获取 IP 地址和端口。有什么方法可以从这个“发件人”对象中获取发件人的 IP 地址和端口号?
谢谢您的帮助。
(您并没有真正说出哪些演员,所以我假设 Akka 的答案也可以)
该sender
方法为您提供ActorRef
了在发送站点隐式或显式拾取的内容:如果您!
在演员中使用,implicit val self: ActorRef
则会找到并使用它。如果该发件人与收件人居住在不同ActorSystem
的地方,即它是远程消息发送,则sender
ref 将包含回复所需的所有信息,只需查看其路径:
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
(和端口的模拟)应该给你你需要的东西。
在 AKKA 演员系统中,!被重载为 def !(message : scala.Any)(implicit sender : akka.actor.ActorRef) 其中 sender 是发送消息的参与者。之后,您可以在 ActorRef 上调用 path 方法,但我认为您无法从那里获得真实的 IP 地址。