我使用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)
}
你知道吗?
答案 0 :(得分:1)
您希望通过处理另一条消息来处理响应。如果您可以考虑来自其他actor的响应消息,那么仅使用tell
(!
)发送请求就足够了,并为响应的receive方法添加一个case。 / p>
如果您需要避免混淆并行请求和响应,则可能需要使用become
和Stash
来确保一次只能处理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]
并将结果的提取委托给调用者。