【问题标题】:From where we get sender actor when a particular message is received?当收到特定消息时,我们从哪里获得发送者演员?
【发布时间】:2012-11-02 10:40:21
【问题描述】:

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

我的问题是如何在收到消息时访问此“发件人”?

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

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

感谢您的帮助。

【问题讨论】:

  • 如果 IP 地址是消息的一部分,是否可以将其放入消息中?

标签: scala actor remote-actors


【解决方案1】:

(您并没有真正说明哪些演员,所以我假设 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(以及端口的模拟)应该可以满足您的需求。

【讨论】:

  • 不幸的是,我没有使用 akka ...您知道如何在 scala 演员中做到这一点吗?...无论如何感谢您的帮助 ...
  • 我从未在 scala.actors 中使用过远程处理,但据我所知,您可能有兴趣研究 Akka,这是一个经过行业验证的解决方案。 scala.actors.remote 自 2009 年 7 月以来一直没有被触及(不包括一般的 scala 库重构),所以我认为可以说它没有维护。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 2021-12-08
    • 2015-07-28
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多