2014-09-22 51 views
12

在阿卡我可以創建一個演員如下。如何獲得Akka actor作爲ActorRef的名字?

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

然後我在一個不同的班級,我怎麼能得到這個演員?

我可以得到一個ActorSelection

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

然而,ActorSelection是不是我想要的;我想要一個ActorRef。我如何獲得ActorRef

我想要一個ActorRef,因爲我希望使用調度程序調度到ActorRef

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

爲什麼你需要演員裁判,你可以發送消息給actorseletion。但是,如果您正在父上下文中查找子actor,則可以使用getContext()。child(「somename」) – 2014-09-22 04:54:17

回答

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()

但對於您所描述的情況下,可能更適合使用調度將消息發送到ActorRef你已經有(像self或新的臨時演員),並通過反應該消息發送MessageCaseClassactorSelection("user/somename")

+1

另請參閱http://letitcrash.com/post/55504766698/2-2-spotlight- actorselection手錶和 - 確定 – jsirocchi 2014-09-22 06:24:52