我的问题是关于处理来自其他演员的演员的回应,并对这些结果执行一些动作。
这里是接收方法的简短伪示例:
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
这里是一些通用的业务处理逻辑。
首先,它看起来完全不可读。 第二 - 地图中的故障未得到处理,也没有报告。
请问您能解释我应该如何在演员和消息方面处理这种逻辑?
谢谢!
答案 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
每当你发现自己将flatMap
和map
链接在一起时,你应该考虑使用这样的理解来清理。
答案 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类
上定义的onComplete
,onSuccess
,onFailure
回调方法
正如库恩博士澄清的那样,使用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)