2014-06-17 60 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