如果你打电话
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")