每当一个actor在scala中收到一条消息时,我们就可以使用一个关键字'sender'来访问该actor的发送者,该关键字是trait AbstractActor的一个对象。
我的问题是,每当收到邮件时,这个“发件人”如何变得可访问。
并且,我们可以覆盖此实现,其中还有一些其他数据也可以访问,例如ipaddress,数据所在的端口。
据我所知,你无法从消息来源的位置获取ipaddress和端口..有没有什么办法可以从这个'sender'对象中获取发件人和端口号的ipaddress?
感谢您的帮助。
答案 0 :(得分: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 :(得分:1)
在AKKA演员系统中,!被重载为 def!(消息:scala.Any)(隐式发送者:akka.actor.ActorRef) sender是发送消息的actor。之后你可以在ActorRef上调用path方法,但我认为你不能从那里获得真正的IP地址。