2014-09-22 1 views
12

In Akka posso creare un attore come segue.Come ottenere l'attore Akka per nome come ActorRef?

Akka.system(app).actorOf(Props(classOf[UnzipActor]), name="somename") 

Quindi sono in una classe diversa, come posso ottenere questo attore?

posso ottenere un ActorSelection

lazy val unzip: ActorSelection = 
    Akka.system.actorSelection("user/" + "somename") 

Tuttavia, un ActorSelection non è quello che voglio; Voglio un ActorRef. Come posso ottenere un ActorRef?

Desidero avere un ActorRef poiché desidero pianificare una chiamata a un ActorRef utilizzando lo scheduler.

Akka.system(app).scheduler.schedule(
    5 seconds, 60 seconds, mustBeActorRef, MessageCaseClass()) 
+0

Perché è necessario attore ref, è possibile inviare un messaggio a actorseletion. Tuttavia, se stai cercando un attore bambino nel contesto padre, puoi usare getContext(). Child ("somename") –

risposta

16

È possibile utilizzare il metodo resolveOne in ActorSelection per ottenere un ActorRef in modo asincrono.

implicit val timeout = Timeout(FiniteDuration(1, TimeUnit.SECONDS)) 
Akka.system.actorSelection("user/" + "somename").resolveOne().onComplete { 
    case Success(actorRef) => // logic with the actorRef 
    case Failure(ex) => Logger.warn("user/" + "somename" + " does not exist") 
} 

ref: http://doc.akka.io/api/akka/2.3.6/index.html#akka.actor.ActorSelection

4

Looking up Actors by Concrete Path:

Per acquisire un ActorRef che è legato al ciclo di vita di un attore specifico è necessario inviare un messaggio, come ad esempio il built-in Identify messaggio, per l'attore e utilizzare il riferimento sender() di una risposta dall'attore.

Ma per il caso che stai descrivendo, potrebbe essere più opportuno utilizzare lo scheduler per inviare un messaggio a un ActorRef hai già (come self o un nuovo attore temporanea), e reagire a quel messaggio da inviando un MessageCaseClass a actorSelection("user/somename").

+1

vedi anche qui http://letitcrash.com/post/55504766698/2-2-spotlight- actorselection-watch-and-identificare – jsirocchi