在Akka中等待功能完成或在5秒后超时

时间:2015-04-20 23:39:57

标签: scala akka

我试图在5秒后等待功能完成或超时,但无论我做什么,我都无法阻止以下异常。有趣的是,它被父母扮演者抓住了:

java.util.concurrent.TimeoutException: Futures timed out after [5 seconds]

我尝试过的解决方案之一(来自this问题):

val f = Future { dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec() }
val result: Try[InputStream] = Await.ready(f, 5.seconds).value.get

val resultEither = result match {
  case Success(t) => log.info("right")
  case Failure(e) => log.info("left")
}

1 个答案:

答案 0 :(得分:3)

确实可以通过akka ask模式实现这一目标。但是有一种不同的解决方案可以在没有akka的情况下使用。

将阻止的Await代码包装到另一个Future并注册onComplete功能

import concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scala.concurrent.{Await, Future}
import scala.util.{Failure, Success, Try}

val sleepTimeout = 1*1000

val f = Future( Thread.sleep(sleepTimeout); Try(10))
val timeoutFuture = Future(Await.result(f, 5.seconds))
timeoutFuture.onComplete {
  case Success(Success(t))  => println(t)
  case Success(Failure(ex))  => println("error on Try" + ex.getMessage)
  case Failure(e) => println("timeout " + e.getMessage)
}

解释匹配案例

  • Success(Success(t))首先Success代表timeoutFuture,这意味着它没有超时。第二个Success用于Try - 表示没有抛出异常。
  • Success(Failure(ex))与第一个相同,但Try
  • 中有例外
  • Failure(e)这是处理超时的地方。