根据 Victor 所说的,如果您想Future
使用 using从特定类型的故障中恢复,recover
您需要注意recover
返回一个新Future
的,并且您需要调用get
它才能获得恢复功能。像这样的东西:
val f1 = Future({ Thread.sleep(2000); 0}, 500)
val withRecover = f1.recover {
case timeout: FutureTimeoutException => -2
}
println(withRecover.get)
或者你可以像这样将它链接到Future
创作上:
val f1 = Future({ Thread.sleep(2000); 0}, 500).recover {
case timeout: FutureTimeoutException => -2
}
println(f1.get)
编辑
因此,与 scala 2.10 中的 Futures 和 Promises 相比,Akka 1.3 中的工作方式似乎与它们自己的内部期货有所不同。在 Akka 1.3 中,recover 仅适用于非超时情况。我举了一个如何解决这个问题的例子,但如果可能的话,你真的应该升级以获得最新的 scala 和 akka:
import akka.dispatch._
import java.util.concurrent.TimeUnit.{ NANOSECONDS ⇒ NANOS, MILLISECONDS ⇒ MILLIS }
import akka.actor.Actor
object FutureTest {
def main(args: Array[String]) {
val f1: Future[Int] = Future({
Thread.sleep(2000)
0
}, 500)
val f2 = recoverTO(f1) {
-2
}
println(f2.get)
}
def recoverTO[T, A >: T](fut:Future[T])(f: => A): Future[A] = {
val fa = new DefaultCompletableFuture[A](fut.timeoutInNanos, NANOS)
fut.onTimeout { future =>
fa completeWithResult f
}
fut.onComplete {
fa complete _.value.get
}
fa
}
}