2015-02-08 11 views
5

è possibile in Akka (scala) ottenere un riferimento ad un ActorSystem esistente?Come ottenere un riferimento ad un ActorSystem esistente in Akka?

Sto lavorando a un'applicazione Spray con un altro attore per DB. Sto anche estendendo le direttive per avere un oggetto per percorso. le direttive non sono attori da sole, ma devono passare messaggi al DBActor. qui:

class HttpActor extends Actor with HttpService { 

    val actorRefFactory = context 

    def receive = runRoute(
    IndexService.route ~ 
    HostsService.route  
) 
} 

object HostsService extends Directives{ 
    def route(implicit dm: DetachMagnet2) = { 
    path("hosts") { 
     get { 
     detach() { 
      **dbActor ! CreateHost** 
      complete("get me hosts!") 
     } 
     } ~ 
     post { 
     detach() { 
      entity(as[String]) { payload => 
      complete(s"post hosts $payload")  
      } 
     } 
     } 
    } 
    } 
} 

c'è un modo per HostsService per scoprire l'ActorSystem in sé, così da poter trovare la DBActor, o deve passare HttpActor altrove? quest'ultimo sembra meno elegante, in quanto HostsService dovrà diventare una classe (non un oggetto), quindi non più un singleton.

risposta

1

Da here:

c'era un biglietto per la creazione di tale registro, ma non stati soddisfatti con quello che abbiamo ottenuto quando si cerca di specificare la semantica in dettagli. Una parte è che abbiamo rimosso tutto lo stato globale in modo che diverse parti dello di un'applicazione possano utilizzare Akka senza doversi preoccupare dello a vicenda e una funzionalità globale potrebbe rompere questo. Un altro è che lo incoraggerebbe l'uso di get-or-create, il che renderebbe poco chiara la semantica : si dà un nome e una configurazione, ma se esiste già il nome , è possibile che venga ripristinato un sistema diversamente configurato (che di solito è abbastanza fatale).

Non c'è nulla ti impedisce di mettere una HashMap in qualche centro luogo della vostra applicazione, (pre) compilare che con i sistemi attore necessari e da fare, che è fondamentalmente un one-liner (che è un altro motivo per cui non includendolo nel Akka, perché invece di una semplice soluzione ad un problema molto stretta avremmo dovuto pensare a una soluzione per un problema molto più generico)

nel tuo caso, è meglio passare implicitamente il sistema alla funzione route:

class HttpActor extends Actor with HttpService { 

    implicit val actorRefFactory = context 

    def receive = runRoute(
    IndexService.route ~ 
    HostsService.route  
) 
} 

object HostsService extends Directives { 
    def route(implicit dm: DetachMagnet2, as: ActorContext) = {...} 
} 
+0

che ha funzionato, e abbastanza buono per me. ora ho bisogno di arrivare al mio prossimo problema, che è il motivo per cui tutti i percorsi sembrano essere richiamati al riavvio, ma quando chiamo gli indirizzi, tutto quello che ottengo è il thread del listener che dice che sta inviando la richiesta GET a un gestore che sembra come un attore di sistema (.../system/IO-TCP/selettori/...), e non succede nient'altro ... –

Problemi correlati