我试图在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")
}
答案 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)
这是处理超时的地方。