我有一群像阿卡族演员
A --> B --> C
演员A“询问”演员B,而演员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
关于scala - Akka Actor /scala-单个onSuccess多次询问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26343282/