【发布时间】:2016-02-25 10:07:56
【问题描述】:
我有一些启动“慢”过程的代码,我将其包装在 Future 中。如果出现问题,我想在暂停后慢慢循环并重试——无限期。有点像这样:(我知道最终会有人干预并解决问题)
def doSomething():Unit = {
aFutureThing().onComplete {
case Success(s) => println("Success: "+s)
case Failure(x) =>
// Take some (hopefully) corrective action here, call for help, etc.
Thread.sleep(1000) // pause a bit
doSomething() // and try again...
}
}
doit()
当调用 onComplete 回调时,doSomething() 是否仍在堆栈上,还是因为我们在 Future 执行慢速任务 (aFutureThing) 时返回而将其弹出? doSomething 的递归调用(最终)会炸毁堆栈/OutOfMemory 吗?如果是这样......有没有更安全的方法来重试未来?
【问题讨论】:
-
作为(重要的)旁注:您绝对应该不在生产代码中的未来内部调用
Thread.sleep,因为这将阻塞未来当前正在执行的线程上。相反,您应该安排另一个未来在以后执行。例如,请参阅其他问题:stackoverflow.com/questions/16359849/scala-scheduledfuture