2014-06-17 58 views
0

一些超时值,假设我有一个未来:等待对未来

val fut = future(...) 

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

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

也许有一个功能更强大的方法呢?

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

+0

什么是执行询问处理结果的演员?那么演员然后发送一些基于该结果回到其发送者或是只是根据询问的结果采取一些内部操作? – cmbaxter

回答

3

首先,看看这个question

然后,如果你有超时行为将来应该可以使用恢复:

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

编辑:

问题1

从问格局scaladoc:

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

问题2

我会使用相同的超时两个,除非你希望两个超时在另一个之前结束的一个(例如,你要处理从等待异常,而不是失败的从未来)。

这就是说,我希望你知道阻止应尽可能避免

+0

我编辑了我的问题 – maks

+0

>>>我愿意我们e两者的超时时间相同,除非您希望两个超时之一在另一个之前结束<<< 如果我想要两种不同的超时行为(这里假设Timeout可以发送消息到隐式目标演员;如果我在这里误解了任何内容,请纠正我)。 1>发送消息时处理超时。 2>处理等待未来的超时完成。 另一个后续问题.. 如果我想要发送超时等待消息<未来的实际操作超时完成。 –

0

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

最好是“开火并忘记”:将请求作为普通消息发送给演员,然后照常在您的receive方法中处理响应。这使您可以保持完全异步。

除非你真的不能做任何有用的工作,除非你收到了这位演员的回应,最好避免ask

如果你真的必须使用ask,该timeout参数是时间的阿卡框架将等待这个演员完成FutureAskTimeoutException之前响应的时间,这个超时独立于在等待结果施加任何超时为未来(即在等待结果(...,超时)

+0

我在那里使用actor,因为我想同步对某些资源的访问。我可以使用同步方法,但对我来说,使用actor来达到这个目的似乎更方便。此外,该资源必须更新一些频率。 Akka提供了诸如调度程序之类的设施(另一点用于阿卡使用) – maks