斯卡拉期货。如果其中一个失败则采取行动
Scala Futures. Action if one of several fails
我有一种情况,我想作为未来并发执行多个任务,这样如果其中一个任务失败,其他任务仍然会执行。
如果失败,我想记录它的错误。
我希望我的父线程能够判断每个线程是否成功,然后根据它执行一些操作。例如,如果其中一个期货失败,则打印 "Hey, one of the futures failed"
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",因为这需要时间,我想给期货尽可能多的时间 运行。现在让我们假设它们 "will" 完成,但在完全取决于数据大小的不确定时间范围内完成。
应该是这样的:
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
辅助方法将 futures 集合转换为 future 包装结果集合。如果源期货之一失败,则由此产生的期货将失败。
我有一种情况,我想作为未来并发执行多个任务,这样如果其中一个任务失败,其他任务仍然会执行。 如果失败,我想记录它的错误。 我希望我的父线程能够判断每个线程是否成功,然后根据它执行一些操作。例如,如果其中一个期货失败,则打印 "Hey, one of the futures failed"
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",因为这需要时间,我想给期货尽可能多的时间 运行。现在让我们假设它们 "will" 完成,但在完全取决于数据大小的不确定时间范围内完成。
应该是这样的:
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
辅助方法将 futures 集合转换为 future 包装结果集合。如果源期货之一失败,则由此产生的期货将失败。