演员应如何处理其他演员的回应?

时间:2013-11-07 16:10:51

标签: scala akka

我的问题是关于处理来自其他演员的演员的回应,并对这些结果执行一些动作。

这里是接收方法的简短伪示例:

case data: Data =>
    val data2 = actor1 ? data.fieldA
    val almostFinished = data2.flatMap { d2 => 
        val data3 = actor2 ? d2.fieldB
        data3.map { d3 => 
            actor3 ? someStuff(d3)
        }
    }
    almostFinished.map { r =>
        someFinalStuff(r)
    } pipeTo sender

这里是一些通用的业务处理逻辑。

首先,它看起来完全不可读。 第二 - 地图中的故障未得到处理,也没有报告。

请问您能解释我应该如何在演员和消息方面处理这种逻辑?

谢谢!

3 个答案:

答案 0 :(得分:2)

使用ask和future的另一种方法是使用临时演员和Akka 2.2.3中引入的Aggregator Pattern

答案 1 :(得分:1)

你可以尝试一下:

case data: Data =>
  val data2Fut = (actor1 ? data.fieldA).mapTo[Data]
  val result = 
    for{
      data2 <- data2Fut
      data3 <- (actor2 ? data2.fieldB).mapTo[Data]
      data4 <- (actor3 ? someStuff(data3)).mapTo[Data]
    } yield someFinalStuff(data4)
  result pipeTo sender

每当你发现自己将flatMapmap链接在一起时,你应该考虑使用这样的理解来清理。

答案 2 :(得分:0)

对于无法读取的代码,某些for语法可以为我们提供一些更新

case data: Data =>
  val combinedFuture: Future[Stuff] =
    for {
      data2 <- actor1 ? data.fieldA
      data3 <- actor2 ? data2.fieldB
      stuff <- actor3 ? someStuff(data3)
    } yield someFinalStuff(stuff)

  combinedFuture pipeTo sender

事实上,您的示例似乎完全是为了展示for-comprehension

的用处

至于在未来的呼叫管道中检测到故障的问题&#34;,您可能想知道Future[A]类型只能有两个可能的实例之一:

Success[A]
Failure[T <: Throwable]

您可以测试类型或更好,您应该使用Future

上定义的onCompleteonSuccessonFailure回调方法

正如库恩博士澄清的那样,使用pipeTo管道失败的未来将向收件人发送Status.Failure消息,您可以从中获取错误Throwable实例

修改

当cmbaxter注意到,?模式将返回&#34;无类型&#34;未来,需要某种强制来回馈正确的类型值,使用mapTo

正确的代码将变为

  val combinedFuture: Future[Stuff] =
    for {
      data2 <- (actor1 ? data.fieldA).mapTo[Data2]
      data3 <- (actor2 ? data2.fieldB).mapTo[Data3]
      stuff <- (actor3 ? someStuff(data3)).mapTo[Intermediate]
    } yield someFinalStuff(stuff)