Akka actors/scala - 单个onSuccess处理多个请求

3

我有一组类似于akka actors的链式结构

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完成处理后才进行最终处理),但不用说,它看起来很糟糕。我尝试使用flatmaps,但无法使其正常工作。有什么好的建议让它看起来更好吗? 谢谢


没有。演员C调用数据库并更新缓存。 - mohit
也许我错过了某些基本规则,但是这个使用非actor的新实现比我们以前的实现更好。虽然我不喜欢类型转换,但由于它提供的性能优势,我可以接受它。 - mohit
1个回答

4

更加适当的方式:

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

谢谢。我会测试并接受它作为正确答案 :) - mohit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接