如果你打電話
sender.path.toString
的男演員,你會得到發送者的地址。因此,只要您可以向其發送消息,您就不需要將地址傳遞給其他演員系統。
Akka不會給你一個在本地系統中的演員的遠程路徑,這就是爲什麼self.path.address.toString
在演員B中將無法工作。
如果您確實想將主機和端口從B發送到A,那麼您需要通過ExtendedActorSystem
訪問RemoteActorRefProvider
。官方的方式是通過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
遠程通信
(注意,此代碼與阿卡2.0.x的在2.1.x的,你可以儘量避免前往的確切地址通過RemoteActorRefProvider
使用system.provider.getDefaultAddress
)
在阿卡,如果你正在使用構建演員地址這種方式與actorFor
使用,那麼你需要確保主機名完全匹配。
例如,如果ActorSystem認爲宿主是foo.bar.com
,那麼它將忽略由遠程主機發送的消息到actorFor("akka://[email protected]:2555/user/slaverunner")
你應該最肯定不行:「context.system.asInstanceOf [ExtendedActorSystem] .provider.asInstanceOf [RemoteActorRefProvider] .transport.address」。任何和所有盲目鑄造完全不受支持。請閱讀文檔以瞭解如何完成此任務的說明,我向你保證它在那裏。 –
通過'RemoteActorRefProvider'消除了不受支持的投射,並添加了Akka 2.1的示例。 – sourcedelica
您剛剛爲MatchError交易了一個ClassCastException。代碼會執行細節更改會怎樣? –