如何从Akka 1.3中返回超时值?

如何从Akka 1.3中返回超时值?,akka,Akka,鉴于以下情况: 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 } print

鉴于以下情况:

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)

为什么我仍然得到一个例外?是否有一种方法可以从超时中恢复,从而返回一个实际值?

期货只写一次,因此修改具有值(或异常)的期货的唯一方法是返回一个新的期货。检查“恢复”的返回类型。

根据Victor所说的进行构建,如果您想使用
recover
从具有
Future
的特定类型故障中恢复,您需要知道
recover
返回一个新的
Future
,您需要调用
get
以获得恢复功能。大概是这样的:

val f1 = Future({ Thread.sleep(2000); 0}, 500)
val withRecover = f1.recover {
  case timeout: FutureTimeoutException => -2
}
println(withRecover.get)
或者您可以将其链接到
未来的
创建中,如下所示:

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
  }    
}

仍然失败。。。我一定是做错了什么?Scala 2.9.1,Akka 1.3.1。尝试将case语句中的异常类型更改为
java.util.concurrent.TimeoutException
。我的猜测是,您没有捕获正确的异常,因此没有激活恢复功能。异常的全名是
akka.dispatch.FutureTimeoutException
,堆栈跟踪证明了这一点。@Françoisbausoleil,我更新了我的答案,解释了akka 1.3中的工作原理。。。