如何从actor内部获取绝对远程actor url?

que*_*sam 10 scala akka

我想做这样的事情.

演员A:

    actorB ! "info"

     def receive()={
     case _ => {
          println("Remote address is "+ _)

        }
}
Run Code Online (Sandbox Code Playgroud)

演员B :(远程部署)

def receive()={
 case "info" => {
      sender tell self.path.address.toString

    }

}
Run Code Online (Sandbox Code Playgroud)

我想让它返回字符串akka://10.4.20.40:2555/slave/user/slaverunner.但我得到的只是akka://奴隶.如何获取远程主机和端口?.地址对象上的属性host,port和hostport不返回任何内容

sou*_*ica 8

如果你打电话

sender.path.toString
Run Code Online (Sandbox Code Playgroud)

在演员A中,您将获得发件人的地址.因此,只要您可以向其发送消息,就不需要将地址传递给另一个actor系统.

Akka不会为本地系统中的演员提供远程路径,这就是self.path.address.toString演员B无法工作的原因.

如果你真的想将主机和端口从B发送到A,那么你需要RemoteActorRefProvider通过它访问a ExtendedActorSystem.正式的方法是通过扩展.例如:

class MyExtensionImpl(system: ExtendedActorSystem) extends Extension {
  def address = system.provider match {
    case rarp: RemoteActorRefProvider => rarp.transport.address
    case _ => system.provider.rootPath.address
  }
}

object MyExtension extends ExtensionKey[MyExtensionImpl]

val address = MyExtension(system).address
Run Code Online (Sandbox Code Playgroud)

这将为您提供与B远程通信所需的确切地址.

(注意此代码适用于Akka 2.0.x.在2.1.x中,您可以避免RemoteActorRefProvider使用system.provider.getDefaultAddress)

在Akka中如果您使用构造actor地址以便使用,actorFor那么您需要确保主机名完全匹配.

例如,如果ActorSystem认为主机是foo.bar.com,那么它将忽略远程主机发送的消息actorFor("akka://slave@foo:2555/user/slaverunner")