如何通过名称获取Akka Actor作为ActorRef?

22
在Akka中,我可以按照以下方式创建一个Actor。
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())

为什么需要Actor引用,你可以向ActorSelection发送消息。但是,如果你正在父上下文中寻找子Actor,你可以使用getContext().child("somename")。 - S.Karthik
2个回答

25
你可以在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


我们如何在Java中实现相同的功能? - Arun

7

通过具体路径查找Actor:

要获取绑定到特定Actor生命周期的ActorRef,需要向该Actor发送消息,例如内置的Identify消息,并使用来自Actor的回复的sender()引用。

但对于你所描述的情况,更适合使用调度程序向您已拥有的ActorRef(如self或新的临时Actor)发送消息,并通过向actorSelection("user/somename")发送MessageCaseClass来响应该消息。


1
请参见此处:http://letitcrash.com/post/55504766698/2-2-spotlight-actorselection-watch-and-identify - jsirocchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接