如何在Scala中的Future中获取对象

时间:2017-12-19 17:25:18

标签: scala akka

我使用Akka myActor1向另一个myActor2询问未来的响应,如下所示:

val future = myActor2 ? request
val result = Await.result(future, timeout.duration).asInstanceOf[Person]

让我们说结果是这样的案例类:

case class Person(name: String, age: Int)

我不想阻止这个过程,所以我选择不使用Await.result。 因此,我有以下代码:

val future = (myActor2 ? request).mapTo[Person]

现在的未来是未来[人]而不是未来[任何]。 我怎样才能提取未来包含的人并处理异常? 我尝试使用onComplete但是Success似乎只接受Int而不是Person。我想要下面的内容:

future onComplete {
   case Success(result) => result
   case Failure(failure => doSomethingOnFailure(failure)
}
你知道吗?

2 个答案:

答案 0 :(得分:1)

您希望通过处理另一条消息来处理响应。如果您可以考虑来自其他actor的响应消息,那么仅使用tell!)发送请求就足够了,并为响应的receive方法添加一个case。 / p>

如果您需要避免混淆并行请求和响应,则可能需要使用becomeStash来确保一次只能处理1个请求。当然,要意识到这会限制系统的吞吐量。

如果您希望以某种方式“转换”响应,然后将其传递给receive处理程序,则pipe模式可能会派上用场:

import akka.pattern.pipe

...
    val someIdentifier = ???
    (myActor2 ? request)
      .map(response => MyCommandWith(response, someIdentifier))
      .pipeTo(self)

这将收集ask的结果,对其进行映射,然后将其作为消息发送给当前的演员(self)。不过要小心不要关闭map函数中的任何actor状态!

如果您希望邮件的原始发件人完成更多结果或错误处理,则根本不需要pipe,但您可以使用forward代替ask

答案 1 :(得分:0)

Future[Person]转换为Person是没有魔力的。您必须在此未来调用Await来提取结果或使这段代码返回Future[Smth]并将结果的提取委托给调用者。