Jeśli zadzwonisz
sender.path.toString
w aktora A dostaniesz adres nadawcy. Nie musisz więc przekazywać adresu innemu systemowi aktorskiemu, o ile możesz wysłać do niego wiadomość.
Akka nie da ci zdalnej ścieżki dla aktora w systemie lokalnym, dlatego self.path.address.toString
w aktor B nie będzie działać.
Jeśli naprawdę chcesz wysłać hosta i port z B na A, musisz uzyskać dostęp do RemoteActorRefProvider
przez ExtendedActorSystem
. Oficjalnym sposobem na to jest Extension. Na przykład:
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
I to daje dokładny adres, który trzeba komunikować się zdalnie z B.
(uwaga ten kod działa z Akka 2.0.x. W 2.1.x można uniknąć dzieje przez RemoteActorRefProvider
przy użyciu system.provider.getDefaultAddress
)
W Akce jeśli używasz konstruowania adresy aktor w ten sposób do pracy z actorFor
to trzeba się upewnić, że nazwy hostów dopasować dokładnie.
Na przykład jeśli ActorSystem myśli gospodarz jest foo.bar.com
, a następnie będzie ignorować wiadomości wysłane przez zdalnego hosta do actorFor("akka://[email protected]:2555/user/slaverunner")
Należy zdecydowanie nie robić: „context.system.asInstanceOf [ExtendedActorSystem] .provider.asInstanceOf [RemoteActorRefProvider] .transport.address ". Wszelkie ślepe rzucanie jest całkowicie nieobsługiwane. Przeczytaj dokumentację opisującą, jak wykonać to zadanie, zapewniam Cię, że jest tam. –
Pozbyłem się nieobsługiwanego przesyłania za pomocą 'RemoteActorRefProvider' i dodałem przykład dla Akka 2.1. – sourcedelica
Właśnie wymieniono wyjątek ClassCastException dla elementu MatchError. Co zrobi kod, zmieniają się szczegóły realizacji? –