2012-05-11 12 views
5

Se creo un attore usando context(). ActorOf() in Akka, ottengo un ActorRef valido. Tuttavia, se faccio lo stesso, ma creo un ActorRef usando actorFor e il percorso che conosco a cui apparirà l'attore, non riesco a recuperare in modo affidabile un ActorRef valido. Come posso dire che un attore è stato registrato con successo?In Akka, come faccio a sapere quando un attore è pronto per l'uso dopo essere stato registrato con actorOf()?

Nella descrizione precedente, potrei semplicemente usare ActorRef restituito da actorOf(). Tuttavia, nel mio caso concreto creo un attore che registra un attore bambino e devo risolverlo, quindi il problema in generale è "come posso aspettare/registrarmi per essere informato di un attore che è stato registrato su un percorso noto? ".

risposta

1

Prima di tutto, non vi è alcuna garanzia che ActorRef torni da actorOf sia ancora attivo, poiché il costruttore potrebbe aver fallito.

In secondo luogo, l'attore può trovare l'attore ma è morto solo dopo essere stato trovato e poco prima di iniziare a lavorarci.

In terzo luogo, è buona norma strutturare l'applicazione in modo che le dipendenze vengano propagate in modo logico, in modo che vi sia un punto di incontro naturale tra i vostri attori.

Speranza uno dei suddetti aiuti,

felice hAkking!

+1

Concordato sui due primi punti, l'attore potrebbe non esserci mai stato e potrebbe essere andato via prima che tu abbia la possibilità di usarlo. Per prima cosa, suppongo che quello che cerco veramente sia come avviare correttamente un sistema basato su attori. Dovrei chiedere() un attore che rappresenta un sottosistema utilizzando un messaggio di avvio per assicurarsi che sia esso e i suoi sottosistemi a turno siano pronti? – SoftMemes

+0

Crea il tuo sistema come un grafico di attori. Quindi puoi usare una combinazione di DeathWatch e eventStream del sistema per pubblicare vivo/morto. Sarebbe interessante anche avere un LifeWatch. Ma il rischio è che perdi memoria se l'attore non viene mai in vita. –

+0

quando si utilizza akka.testkit, si invia un messaggio all'attore immediatamente istanziato .. è necessario un modo per sapere che è pronto .. – KitAndKat

7

Dal Akka 2.2.1 è possibile utilizzare ActorSelection.resolveOne per ottenere un ActorRef da una selezione attore:

implicit val timeout = Timeout(5, TimeUnit.SECONDS) 
val selection = system.actorSelection("/user/myActor") 
val actor = Await.result(selection.resolveOne(), timeout.duration) 

Dalla documentazione http://doc.akka.io/api/akka/2.2.1/index.html#akka.actor.ActorSelection

Risolvere l'abbinamento ActorRef questa selezione Il risultato viene restituito come un futuro che viene completato con l'ActorRef se tale attore esiste . Completato con errore ActorNotFound se non esiste un tale attore o l'identificazione non è stata completata entro il timeout fornito.

Sotto il cofano si parla con l'attore per verificare la sua esistenza e la acquisire la sua ActorRef.