Se si chiama
sender.path.toString
in attore A si otterrà l'indirizzo del mittente. Quindi non è necessario passare l'indirizzo a un altro sistema di attori fintanto che è possibile inviare un messaggio ad esso.
Akka non ti darà un percorso remoto per un attore nel sistema locale, motivo per cui self.path.address.toString
nell'attore B non funzionerà.
Se si desidera realmente inviare l'host e la porta da B a A, è necessario accedere a RemoteActorRefProvider
tramite ExtendedActorSystem
. Il modo ufficiale per farlo è attraverso un Extension. Per esempio:
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
E che vi darà l'indirizzo esatto che avete bisogno di comunicare a distanza con B.
(notare che questo codice funziona con Akka 2.0.x. In 2.1.x si può evitare di andare attraverso RemoteActorRefProvider
utilizzando system.provider.getDefaultAddress
)
In Akka se si utilizza la costruzione indirizzi attore in questo modo per l'utilizzo con actorFor
quindi è necessario assicurarsi che i nomi host corrispondono esattamente.
Per esempio se l'ActorSystem pensa l'host è foo.bar.com
, allora sarà ignorare i messaggi inviati da un host remoto per actorFor("akka://[email protected]:2555/user/slaverunner")
Si dovrebbe sicuramente non fare: "context.system.asInstanceOf [ExtendedActorSystem] .provider.asInstanceOf [RemoteActorRefProvider] .transport.address". Qualsiasi e tutti i casting ciechi sono completamente non supportati. Si prega di leggere la documentazione per la descrizione su come svolgere questo compito, vi assicuro che è lì dentro. –
Eliminato il cast non supportato tramite 'RemoteActorRefProvider' e un esempio aggiunto per Akka 2.1. – sourcedelica
Hai appena scambiato un ClassCastException per un errore MatchError. Quale sarà il codice che farà cambiare i dettagli di implementazione? –