【问题标题】:How to get Akka actor by name as an ActorRef?如何按名称获取 Akka 演员作为 ActorRef?
【发布时间】:2014-11-15 23:30:46
【问题描述】:

在 Akka 中,我可以按如下方式创建一个演员。

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 ref,你可以发送消息给actorseletion。但是,如果您正在父上下文中寻找子actor,则可以使用 getContext().child("somename")

标签: scala akka


【解决方案1】:

Looking up Actors by Concrete Path:

要获取绑定到特定参与者生命周期的ActorRef,您需要向参与者发送消息,例如内置的Identify 消息,并使用sender() 引用演员的回复。

但是对于您所描述的情况,使用调度程序向您已经拥有的 ActorRef 发送消息(如 self 或新的临时演员)可能更合适,并对该消息作出反应通过将MessageCaseClass 发送到actorSelection("user/somename")

【讨论】:

【解决方案2】:

您可以在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 2014-05-15
    • 2013-11-22
    • 1970-01-01
    • 2014-02-07
    • 2019-04-23
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多