【问题标题】:akka ask actorselection from play controllerakka 从播放控制器询问演员选择
【发布时间】:2013-08-04 06:31:55
【问题描述】:

我正在尝试在游戏中实现这种模式:

class MyController extends Controller {
    def getStuff(actorPath: String) = {
        implicit request => Async {
            val myFutureStuff = system.actorSelection(actorPath) ? FindStuff()

            // Handle the result
        }
    }
}

但显然你不能“询问”一个 ActorSelection,只能询问一个 ActorRef。

所以你必须从 ActorSelection 中获取一个 ActorRef,这意味着向 ActorSelection 发送一个“Identify”消息并获取响应。不过,我无法从控制器中找到一种简单的方法来执行此操作,因为参与者无法将“识别”的响应发送回给它。

从我看到的示例中,人们通过控制器与演员交流,他们直接使用 ActorRef。在我的应用程序中,我不想挂在这些 ActorRef 上。相反,我将他们解雇,然后让他们离开,直到我需要与他们沟通。发生这种情况时,我希望能够通过它们的路径来处理它们并询问它们的一些信息。

有没有更好的方法来做我想做的事,同时仍然使用演员后端/播放前端方法?

非常感谢

【问题讨论】:

    标签: scala playframework akka


    【解决方案1】:

    我不确定这是否属实,您应该能够在 ActorSelection 上使用询问模式。所以这在理想情况下应该是可行的,actorSelection 的唯一问题是,由于它只通过路径查找actor,它不能保证您在后续调用中引用的是同一个actor。

    但是,如果您想在非参与者实例中接收回复,其中一种方法是使用未来。

      implicit val timeout = Timeout(5 seconds)
      val future = system.actorSelection(remotePath) ? Identify(remotePath)
      val result = Await.result(future, timeout.duration)
      val actorRef = result match {
        case ActorIdentity(path, Some(actor)) => actor
      }
    

    【讨论】:

    • 当我在控制台中尝试时,我得到: value ?不是 akka.actor.ActorSelecton 的成员
    • 你用的是什么akka版本?
    • 我相信我使用的是 2.2 - 我几周前刚刚下载了这个。
    • 更正 - play Build 文件显示我使用的是 2.1 版本的 akka.actors
    • 啊,这似乎是问题所在。如果您升级到 2.2,我相信这应该可以解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2017-05-08
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多