1

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

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

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

非常感谢

4

1 回答 1

0

我不确定这是否属实,您应该能够在 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
  }
于 2013-08-03T22:22:01.200 回答