ビクターが言ったことに基づいて、特定のタイプの障害からをFuture
使用して回復したい場合は、それが新しいを返す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 の Future と Promises と比較して、Akka 1.3 では独自の内部 Future で動作が異なるようです。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
}
}