scala – 来自Akka的async io的迟到回复
发布时间:2020-12-16 18:15:38 所属栏目:安全 来源:网络整理
导读:我使用akka已经有一段时间了.我开始在我的代码中看到一些模式来解决异步io的延迟回复.这个实现好吗?还有另一种方法可以做一个没有阻止的延迟回复吗? class ApplicationApi(asyncIo : ActorRef) extends Actor { // store senders to late reply val waitin
我使用akka已经有一段时间了.我开始在我的代码中看到一些模式来解决异步io的延迟回复.这个实现好吗?还有另一种方法可以做一个没有阻止的延迟回复吗?
class ApplicationApi(asyncIo : ActorRef) extends Actor { // store senders to late reply val waiting = Map[request,ActorRef]() def receive = { // an actore request for a user,store it to late reply and ask for asyncIo actor to do the real job case request : GetUser => waiting += (sender -> request) asyncIo ! AsyncGet("http://app/user/" + request.userId) // asyncio response,parse and reply case response : AsyncResponse => val user = parseUser(response.body) waiting.remove(response.request) match { case Some(actor) => actor ! GetUserResponse(user) } } } 解决方法
在等待回复时避免阻塞的一种方法是使用ask方法-a.k.a发送. ? operator-返回Future(与!返回()不同).
使用onSuccess或foreach方法,您可以指定在将来/何时通过回复完成时要执行的操作.要使用它,你需要混合 class ApplicationApi(asyncIo : ActorRef) extends Actor with AskSupport { def receive = { case request: GetUser => val replyTo = sender asyncIo ? AsyncGet("http://app/user/" + request.userId) onSuccess { case response: AsyncResponse => val user = parseUser(response.body) replyTo ! GetUserResponse(user) } } 避免使用此技术执行任何修改ApplicationApi actor状态的副作用,因为效果将与接收循环不同步.但是,将消息转发给其他参与者应该是安全的. 顺便说一下,这是捕获当前发送方作为模式匹配的一部分的技巧,避免以后需要将其分配给变量. trait FromSupport { this: Actor => case object from { def unapply(msg: Any) = Some(msg,sender) } } class MyActor extends Actor with FromSupport { def receive = { case (request: GetUser) from sender => // sender is now a variable (shadowing the method) that is safe to use in a closure } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 浅谈ctrl+c,ctrl+d,ctrl+z在linux中的意义
- angularjs – Passport.js,Express.js和Angular.js路由:它
- AngularJS中的JavaScript变量声明
- WebService CXF and Spring2.5
- 在shell脚本之间传递参数,但保留引号
- 从Boot2Docker到Google Compute Engine VM:保存Docker容器
- 在检查多个语句时,bash中条件的最佳实践是什么?
- angularjs – 使用ui-router将父状态默认为子状态
- angularjs – 用于声明控制器的Angular Convention
- 在Scala中将案例类转换为CSV