我正试图在游戏中实现这种模式:
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上。相反,我解雇他们,让他们离开,直到我需要与他们沟通。当发生这种情况时,我希望能够通过他们的路径获取它们并询问它们的一些信息。
在使用演员后端/播放前端方法的同时,还有更好的方法可以做我想要的吗?
非常感谢
答案 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
}