10

我想做这样的事情。

演员甲:

    actorB ! "info"

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

        }
}

演员 B:(远程部署)

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

    }

}

我希望它返回字符串 akka://10.4.20.40:2555/slave/user/slaverunner 。但我得到的只是 akka://slave。如何获取远程主机和端口?. 地址对象上的属性主机、端口和主机端口不返回任何内容

4

4 回答 4

8

如果你打电话

sender.path.toString

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

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

如果您真的想将主机和端口从 B 发送到 A,那么您需要RemoteActorRefProvider通过ExtendedActorSystem. 官方的方法是通过Extension。例如:

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

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

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

在 Akka 中,如果您使用这种方式构建参与者地址以供使用,actorFor那么您需要确保主机名完全匹配。

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

于 2013-01-12T02:49:53.883 回答
3

对于最近的 akka 版本(2.1+),请使用:

class RemoteAddressExtensionImpl(system: ExtendedActorSystem) extends Extension {
  def address = system.provider.getDefaultAddress
}

object RemoteAddressExtension extends ExtensionKey[RemoteAddressExtensionImpl]

val remoteAddr = RemoteAddressExtension(context.system).address
val remotePath = self.path.toStringWithAddress(remoteAddr))

remotePath 是您要查找的内容:

我希望它返回字符串 akka://10.4.20.40:2555/slave/user/slaverunner

对于更新的 akka 版本(2.5.3),请使用:

class RemoteAddressExtensionImpl(system: ExtendedActorSystem) extends Extension {
  def address = system.provider.getDefaultAddress
}

object RemoteAddressExtension extends ExtensionId[RemoteAddressExtensionImpl]
with ExtensionIdProvider {
  override def lookup = RemoteAddressExtension
  override def createExtension(system: ExtendedActorSystem) = new RemoteAddressExtensionImpl(system)
  override def get(system: ActorSystem): RemoteAddressExtensionImpl = super.get(system)
}
于 2014-10-22T10:25:53.997 回答
1

我得到了这个包裹String

 ConfigString("akka://serversys@127.0.0.1:2552")

使用system.settings

context.system.settings.config.getValue("akka.actor.deployment.\"/root\".remote")

Actor 是一个“根”actor,这是 Viktor Klang 在邮件组讨论“确定 actor 是否死亡”时建议的结构方案。它是这样创建的:

lazy val rootActor = actorSystem.actorOf(Props[Root], "root")

从那ActorSystem是这样创建的:

lazy val actorSystem = ActorSystem("serversys", ConfigFactory.parseString(""" 
akka {
  loglevel = "DEBUG"
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    transport = "akka.remote.netty.NettyRemoteTransport"
  }
}
serverconf {
  include "common"
  akka {
    actor {
      deployment {
        /root {
          remote = "akka://serversys@127.0.0.1:2552"
        }    
      }
    }
    remote {
      netty {
        hostname = "127.0.0.1"
        port = 2552
      }
    }
  }
}
""").getConfig("serverconf"))

在 Scala 2.9.2 REPL 中使用我仍然使用的 Akka 2.0.3 进行了测试。

Config在此处使用文档展开实际值:http: //typesafehub.github.com/config/v0.3.0/

于 2013-01-12T00:35:50.133 回答
1

请参阅actorsystem 的公共地址。阅读完整的讨论,并注意“通常”您不需要获取主机/端口。

于 2013-01-12T14:54:12.230 回答