我想做这样的事情.
演员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不返回任何内容
如果你打电话
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")
| 归档时间: |
|
| 查看次数: |
6346 次 |
| 最近记录: |