scala – Actors中期货的执行上下文
发布时间:2020-12-16 19:20:12 所属栏目:安全 来源:网络整理
导读:我有一个Actor,在某些消息上我正在运行一些返回Future的方法. def receive: Receive = { case SimpleMessge() = val futData:Future[Int] = ... futData.map { data = ... }} 是否有可能通过实际上下文来等待这些数据?或者,如果我在SimpleMessage中需要这些
我有一个Actor,在某些消息上我正在运行一些返回Future的方法.
def receive: Receive = { case SimpleMessge() => val futData:Future[Int] = ... futData.map { data => ... } } 是否有可能通过实际上下文来等待这些数据?或者,如果我在SimpleMessage中需要这些数据,那么Await是我能做的最好的事情吗? 解决方法
如果你真的需要在处理下一条消息之前等待将来完成,你可以尝试这样的事情:
object SimpleMessageHandler{ case class SimpleMessage() case class FinishSimpleMessage(i:Int) } class SimpleMessageHandler extends Actor with Stash{ import SimpleMessageHandler._ import context._ import akka.pattern.pipe def receive = waitingForMessage def waitingForMessage: Receive = { case SimpleMessage() => val futData:Future[Int] = ... futData.map(FinishSimpleMessage(_)) pipeTo self context.become(waitingToFinish(sender)) } def waitingToFinish(originalSender:ActorRef):Receive = { case SimpleMessage() => stash() case FinishSimpleMessage(i) => //Do whatever you need to do to finish here ... unstashAll() context.become(waitingForMessage) case Status.Failure(ex) => //log error here unstashAll() context.become(waitingForMessage) } } 在这种方法中,我们处理SimpleMessage,然后切换处理逻辑以存储所有后续的SimpleMessages,直到我们从未来获得结果.当我们得到一个结果,无论是否失败时,我们将在等待未来时继续使用我们收到的所有其他SimpleMessages并继续我们的快乐方式. 这个actor只是在两个状态之间来回切换,允许你一次只完全处理一个SimpleMessage而不需要阻止Future. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |