等待将来的某些超时值

时间:2014-06-17 11:42:09

标签: scala akka future

假设我有一个未来:

val fut = future(...)

我想在这个未来等待一段时间,如果超时到期将来应该返回一些预定义的值。 我知道未来有可能等待,但我想避免这样的代码:

try {
 val result = Await.result(fut, timeout)
} catch {
 case ex: TimeoutException => ???
}

也许有更实用的方法?

修改 我有一个被要求返回一些价值的演员。 Akka的ask具有隐式参数超时以及Await.result。 第一个问题是这些超时如何与彼此相关?第二个问题是:我想从演员那里得到结果。我需要首先询问actor然后等待返回的未来,我是否应该对这两个函数使用相同的超时?

2 个答案:

答案 0 :(得分:3)

首先,看看这个question

然后,如果你有一个超时行为的未来,应该可以使用recover:

val fut = future(...)
fut.recover { case t: TimeoutException => defaultValue }

编辑:

问题1

来自询问模式scaladoc:

  

异步发送消息并返回一个   [[scala.concurrent.Future]]持有最终回复消息;这个   意味着目标参与者需要将结果发送到sender   参考提供。未来将以一个完成   给定超时后[[akka.pattern.AskTimeoutException]]   过期; 这与等待a时应用的任何超时无关   这个未来的结果(即在Await.result(..., timeout)

<强>问题2

我会对两者使用相同的超时,除非您希望两个超时之一在另一个之前结束(例如,您希望从Await处理异常而不是将来的失败)。

尽管如此,我希望您知道应尽可能避免阻止

答案 1 :(得分:0)

如果您正在使用Akka,ask通常不是解决此问题的最常用方法。你强迫事件的顺序是明确的(我问,然后等待响应,然后继续做一些工作)。

更好地解雇&#34;:将请求作为正常消息发送给actor,然后像往常一样处理receive方法中的响应。这使您可以保持完全异步。

除非你在收到这位演员的回复之前真的无法做任何有用的工作,否则最好避免ask

如果您真的必须使用ask,则timeout参数是Akka框架在使用{{1}完成Future之前等待此actor的响应的时间量},此超时独立于等待未来结果时应用的任何超时(即在Await.result(...,timeout)