斯卡拉期货。如果其中一个失败,请采取措施

时间:2016-07-18 15:06:06

标签: scala exception future

我有一种情况,我希望将来同时执行多个任务,以便如果其中一个失败,其他任务仍然会执行。 如果一个失败,我想记录它的错误。 我希望我的父线程能够判断每个线程是否成功,然后基于此执行某些操作。例如,如果其中一个期货失败,请打印"嘿,其中一个期货失败"

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
}

如果任何或所有期货都失败了,我想记录他们的堆栈跟踪,但我不想让我的整个程序出错,直到所有期货都有机会运行。因为他们可能因为不同的原因而全部出错,我不想重复他们的错误,我想抛出一个新错误。

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

我不想使用" Await"因为这需要一段时间,我想给期货提供他们想要运行的尽可能多的时间。让我们暂时假设他们会#34;"完成但在未确定的时间范围内完全取决于数据大小。

1 个答案:

答案 0 :(得分: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)
}

Future.sequence辅助方法将期货集合转换为包含结果集合的未来。如果其中一个来源期货失败,则结果未来将失败。