Diciamo che alcuni sono comunemente usati da altri attori del livello di servizio degli attori. Ad esempio, un servizio di registro che memorizza e recupera oggetti di dominio:Akka - Attore di servizio comune: Identify o Extension
case class DomainObject(id: UUID)
class Registry extends akka.actor.Actor {
def receive: Receive = {
case o: DomainObject => store(o) // save or update object
case id: UUID => sender ! retrieve(id) // retrieve object and send it back
}
}
io non voglio passare esplicitamente esempio di tale registro in tutti i soggetti che possono usarlo. Invece di farlo, voglio che siano in grado di "localizzarlo" in qualche modo.
Per questo mi viene in mente due soluzioni:
Identify
messaggio: ogni attore utente Registro sa registro dei nomi attore da qualche configurazione e in grado di inviato messaggio di identificazione ad esso. DopoAgentIdentity
messaggio è ricevuto di nuovo noi siamo pronti per partire:val registryName = ... // some name val registryId = ... // some id var registry = _ def preStart() { context.actorSelection(registryName) ! Identify(registryId) } def receive: Receive = { case ActorIdentity(`registryId`, ref) => registry = ref }
non mi piace questo modo perché subito dopo l'attore utente inizializzazione v'è una fase in cui non sappiamo se esiste un registro nel sistema di et tutto e quindi non so se saremo mai in grado di operare o meno.
Akka estensioni: Posso creare un'estensione che sarebbe:
a. creare istanza di attore del Registro di sistema in un determinato sistema di attori all'avvio;
b. restituisci questo attore all'utente che ne ha bisogno tramite un metodo in Extension.
object RegistryKey extends ExtensionKey[RegistryExtension] class RegistryExtesion(system: ExtendedActorSystem) extends RegistryKey { val registry = system.actorOf(Props[Registry], "registry") }
La domanda è: qual è il metodo migliore e sono Akka Extesions possono essere utilizzati per questo a tutti?
Credo che si intende 'context.actorSelection (RegistryName)! Identificare (registryId) '. 'actorFor' è un'altra soluzione anche se è deprecata in 2.2. – sourcedelica
Sì, hai assolutamente ragione. Perdite di memoria. :) – Seigert