我有一个 Actor,并且在某些消息上我正在运行一些返回 Future 的方法。
def receive: Receive = {
case SimpleMessge() =>
val futData:Future[Int] = ...
futData.map { data =>
...
}
}
是否可以传递实际上下文来等待此数据?或者Await
如果我需要这些数据,这是我能做的最好的事情简单消息?
如果您确实需要等待 future 完成后再处理下一条消息,您可以尝试如下操作:
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
然后切换处理逻辑来存储所有后续的SimpleMessage
直到我们得到未来的结果。当我们得到结果时,无论失败与否,我们都会释放所有其他结果SimpleMessage
我们在等待未来的同时收到了,并继续我们的快乐之路。
该演员只是在两种状态之间来回切换,这使得您只能完全处理一种状态SimpleMessage
一次而不需要阻止未来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)