2014-09-22 1 views
12

Akka에서는 다음과 같이 액터를 만들 수 있습니다.Akka 배우를 ActorRef로 이름으로 가져 오는 방법은 무엇입니까?

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

그럼 다른 배우와 어떻게 다른 배우가 될까요?

나는 ActorSelection 내가 원하지 않을 것입니다, 그러나 ActorSelection

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

를 얻을 수 있습니다; 나는 ActorRef을 원합니다. ActorRef을 얻으려면 어떻게해야합니까?

스케쥴러를 사용하여 ActorRef에 대한 호출을 예약하고자하므로 ActorRef이 필요합니다.

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

것은, 당신이 actorseletion에게 메시지를 보낼 수 있습니다. 그러나 부모 컨텍스트 내에서 하위 액터를 찾고 있다면 getContext()를 사용할 수 있습니다. child ("somename") –

답변

16

ActorSelection에서 resolveOne 메서드를 사용하면 ActorRef를 비동기 적으로 가져올 수 있습니다.

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") 
} 

심판 : 당신이 배우의 심판이 필요한 이유 http://doc.akka.io/api/akka/2.3.6/index.html#akka.actor.ActorSelection

4

Looking up Actors by Concrete Path :

이 같은 메시지를 보낼 필요가 특정 배우의 생명주기에 바인딩 된 ActorRef을 취득하려면 내장 Identify 메시지, 배우에 액터의 회신에 대한 참조 번호 sender()을 사용하십시오.

하지만이 설명하고있는 경우에, 당신이 이미 (같은 self 또는 새 임시 배우), 그리고에 의해 해당 메시지에 반응 ActorRef에게 메시지를 보낼 수있는 스케줄러를 사용하는 것이 더 적합 할 수 있습니다

MessageCaseClassactorSelection("user/somename")으로 보내십시오.

+1

여기도 참조 http://letitcrash.com/post/55504766698/2-2-spotlight- actorselection-watch-and-identify – jsirocchi

관련 문제