斯卡拉期货。如果其中之一失败则采取行动

Roy*_*ood 3 scala future exception

我有一种情况,我希望将来同时执行多个任务,这样,如果其中一个失败,其他任务仍然可以执行。如果失败了,我想记录一下错误。我希望我的父线程能够判断每个线程是否成功,然后根据该线程执行一些操作。例如,如果其中一项期货失败,则打印“嘿,其中一项期货失败”

val futureA = Future(doTaskThatReturnsABoolean)
val futureB = Future(doTaskThatReturnsABoolean)
val futureC = Future(doTaskThatReturnsABoolean)

futureA.onFailure (case t => println(future A failed ) + t.getMessage)
futureB.onFailure (case t => println(future B failed ) + t.getMessage)
futureC.onFailure (case t => println(future C failed ) + t.getMessage)

if (one of these futures failed) {
  println("One of the futures failed")
  throw new someNewError
}
Run Code Online (Sandbox Code Playgroud)

如果任何或所有的期货都失败了,我想记录他们的堆栈跟踪记录,但是在所有期货都有机会运行之前,我不想使整个程序出错。因为他们可能由于不同的原因而出错,所以我不想只重复他们的错误,而是想抛出一个新的错误。

我一直在阅读http://docs.scala-lang.org/overviews/core/futures.html,但无法理解这一点。

我不想使用“等待”,因为这需要时间,并且我想给期货提供尽可能多的时间。现在,让我们假设它们“将”完成,但是不确定的时间范围完全取决于数据大小。

Ale*_*dar 5

应该是这样的:

val futureA = Future(doTaskThatReturnsABoolean).recoverWith{
  case e:Throwable => println(future A failed ) + t.getMessage; Future.failed(e)
}
val futureB = Future(doTaskThatReturnsABoolean).recoverWith{
  case e:Throwable => println(future B failed ) + t.getMessage; Future.failed(e)
}
val futureC = Future(doTaskThatReturnsABoolean).recoverWith{
  case e:Throwable => println(future  failed ) + t.getMessage; Future.failed(e)
}

val futures = List(futureA, futureB, futureC)
Future.sequence(futures).recoverWith{
  case p:Throwable => println("One of the futures failed"); Future.failed(new SomeNewError)
}
Run Code Online (Sandbox Code Playgroud)

Future.sequencehelper方法将期货集合转换为包装结果集合的期货。如果源期货之一失败,则最终的期货将失败。