akka从播放控制器询问actorselection

时间:2013-08-03 22:04:55

标签: scala playframework akka

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

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上。相反,我解雇他们,让他们离开,直到我需要与他们沟通。当发生这种情况时,我希望能够通过他们的路径获取它们并询问它们的一些信息。

在使用演员后端/播放前端方法的同时,还有更好的方法可以做我想要的吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

我不确定这是否属实,你应该能够在ActorSelection上使用ask模式。所以这应该是理想的工作,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
  }