あなたが電話する場合
sender.path.toString
アクターAでは、送信者のアドレスを取得します。したがって、メッセージを送信できる限り、アドレスを別のアクターシステムに渡す必要はありません。
Akkaは、ローカルシステム内のアクターのリモートパスを提供しません。そのためself.path.address.toString、アクターBでは機能しません。
本当にホストとポートをBからAに送信したい場合は、RemoteActorRefProviderを介してにアクセスする必要があります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
そして、それはあなたがBとリモートで通信するために必要な正確なアドレスをあなたに与えるでしょう。
RemoteActorRefProvider(このコードはAkka 2.0.xで動作することに注意してください。2.1.xでは、を使用して通過を回避できますsystem.provider.getDefaultAddress)
Akkaでは、この方法でアクターアドレスの作成を使用している場合actorForは、ホスト名が完全に一致していることを確認する必要があります。
たとえば、ActorSystemがホストがfoo.bar.comであると判断した場合、リモートホストからに送信されたメッセージを無視します。actorFor("akka://slave@foo:2555/user/slaverunner")