鉴于以下内容:
import akka.dispatch.{FutureTimeoutException, Future}
val f1 = Future({ Thread.sleep(2000); 0}, 500)
f1.onException {
case timeout: FutureTimeoutException => -1
}
f1.recover {
case timeout: FutureTimeoutException => -2
}
println(f1.get)
为什么我仍然会遇到异常?有没有办法从超时中恢复,以便返回实际值?
答案 0 :(得分:1)
建立Victor所说的内容,如果您希望使用Future
recover
使用recover
从特定类型的失败中恢复,则需要注意Future
会返回新的{{1}这就是你需要调用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的期货和承诺相比,Akka 1.3中的内容与其内部期货相比看起来有所不同。在Akka 1.3中,恢复仅适用于非超时情况。我举了一个如何解决这个问题的例子,但是如果可能的话你应该升级以获得最新的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
}
}
答案 1 :(得分:0)
期货是一次性写入,因此修改具有值(或异常)的Future的唯一方法是返回 new Future。检查“恢复”的返回类型。