我有一群像阿卡族演员
A --> B --> C
演员A“询问”演员B,后者又“询问”演员C。演员A需要等待,直到演员C完成处理。B是一个薄层,无非是将消息传递(询问)给C并将Future返回给A。基本上,B只是这样做
{ case msgFromA => sender ! C ? msgFromA }
因此,A得到的是Future [Any]。
A处理请求的方式是使用嵌套映射
actorRefFactory.actorOf(Props[A]) ? msgA map {
resp =>
// Type cast Any to Future and use another map to complete processing.
resp.asInstanceOf[Future[_]] map {
case Success =>
// Complete processing
case Failure(exc) =>
// Log error
这是可行的(即,仅当演员C完成处理后才进行最终处理),但不用说它看起来太可怕了。我尝试使用平面图,但无法使其正常工作。任何使它看起来不错的想法:)谢谢
一种更合适的方法:
在A
:
val f: Future[MyType] = (B ? msg).mapTo[MyType]
f onComplete {
case Success(res) => // do something
case Failure(t) => // do something
}
在中B
,使用forward
:
{ case msgFromA => C forward msgFromA }
在C
:
// call database
// update cache
sender() ! res // actually sends to A
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句