在收到特定邮件时我们从哪里获得发件人演员?

use*_*249 6 scala remote-actors actor

每当actor在scala中收到消息时,我们都可以使用关键字'sender'来访问actor的发送者,该关键字是trait AbstractActor的对象.

我的问题是,每当收到邮件时,这个"发件人"如何变得可访问.

而且,我们是否可以覆盖此实现,其中还有一些其他数据也可以访问,例如ipaddress,数据来自的端口.

据我所知,你无法从消息来源的地方获取ipaddress和端口..有没有办法从这个'发送者'对象中获取发件人和端口号的ipaddress?

谢谢您的帮助.

Rol*_*uhn 6

(你真的没说哪个演员,所以我假设Akka的答案也没关系)

sender方法为您提供ActorRef在发送站点隐式或明确拾取的方法:如果您!在actor中使用,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
Run Code Online (Sandbox Code Playgroud)

因此,简而言之,sender.path.address.host(和端口模拟)应该可以满足您的需求.

  • 我从未使用scala.actors进行远程处理,但据我所知,您可能有兴趣研究Akka,它是经过行业验证的解决方案.scala.actors.remote自2009年7月以来一直没有被触及(不包括一般的scala库重构),所以我认为可以说它没有维护. (3认同)

小智 1

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