在将Akka与Play集成(必须使用Java 7)时,我想要的是控制器动作来触发并忘记给演员的消息.但是,我希望actor将其工作的响应发送给发送http请求的客户端.
我已经在我的控制器中使用ask()成功地尝试了这个...并且想要将其更改为使用tell().当问题回归未来时,它很"容易".
我知道我需要返回一个承诺.
我"理解"阿卡的未来 - 只是不能将故事拼接在一起:
我想象在控制器中,我可以撰写一条消息并通过Http.Context
- current()
?- 我其实想要的Http.Request
,Http.Response
也许是Http.Session
使用发送此消息给路由器actor tell
控制器返回什么?我在哪里Promise< Result>
- 我是否要创建一个包装tell()的Future?如果是这样,怎么样?
一个工人演员完成工作(这可能意味着在Http.Response上序列化一些JSON对象)并向发件人发送回复 - 谁?玩动作?? 想象它是控制器中的未来,我会将Future <?>映射到Promise< Result>
??
(关于以上列表的事情并不是......)
为什么要与此斗争?我想遵循使用tell()的建议 - http://techblog.net-a-porter.com/2013/12/ask-tell-and-per-request-actors/
任何帮助赞赏.
谢谢,s-
您可以按照文章建议的相同方式实现它.创建一个每请求的actor,在成功或失败时将完成在play控制器中返回未来的promise.
所以你的控制器看起来像这样(抱歉,代码在Scala中而不是编译):
def index = Action.async {
val responsePromise = Promise[String]
Akka.system.actorOf(Props(classOf[MyPerRequestActor], responsePromise))
responsePromise.future.map(Ok(_))
}