我有两个参与者,他们要么返回一个布尔值,要么抛出一个异常
val futureA: Future[Boolean] = ask(ActorA, MessageA(obj)).mapTo[Boolean]
val resultA = Await.result(futureA, timeout.duration) //can return boolean or throw an exception
val futureB: Future[Boolean] = ask(ActorB, MessageB(obj)).mapTo[Boolean]
val resultb = Await.result(futureB, timeout.duration)//can return boolean or throw an exception
在这里我想实现
场景1如果futurea和futureb成功,我应该得到(futuresponsea,futuresponseb)//(true,true)
场景2如果futurea失败,它应该继续futureb如果它成功返回,我应该得到类似的结果(除了offuturea,resultoffutureb)
场景3如果futurea成功返回而futureb失败,我应该得到类似的结果(futuresponsea,exceptionoffutureb)
场景4如果futurea和futureb都失败了,我应该得到类似的结果(exceptionoffuturea,exceptionoffutureb)
为此,我尝试了val futurea=ask(actora,messagea(obj)).mapto[boolean]val futureb=ask(actorb,messageb(obj)).mapto[boolean]
val f = Try {Future.sequence(List(futureA, futureB))}
val result = Await.result(f, Duration.Inf)
但我在这个问题上犯了错误 val result
线路
found : scala.util.Try[scala.concurrent.Future[List[Boolean]]]
[error] required: scala.concurrent.Awaitable[?]
我如何存档这些扫描请指点
1条答案
按热度按时间brccelvz1#
一
Try
不是一个Awaitable
,和Future
不会抛出异常,但是Await
可以。所以你得把衣服包起来Await
用一个Try
而且,由于您希望捕获其中一个或两个失败,这意味着两个不同的Await
s。结果类型为
Tuple2[Try[Boolean],Try[Boolean]]
,它涵盖了您列出的4个场景:(成功,成功)(成功,失败)(失败,成功)(失败,失败)