2013-11-27 192 views
0

我想要做的是一次又一次地重複GET請求到服務器,以便我可以同步本地數據與遠程服務器。我想通過使用Future s 而不涉及akka這樣做,因爲我只想了解如何在較低級別執行此操作的基本思路。沒有asyncawait最好或者是因爲它們是FuturesPromises的高級功能,因此我想自己使用FuturesPromises向服務器重複異步請求

所以這是我的功能:

def sendHttpRequestToServer(): String = { ... } 

def send: Unit = { 
    val f = future { sendHttpRequestToServer() } 
    f onComplete { 
    case Success(x) => 
     processResult(x)  // do something with result "x" 
     send     // delay if needed and send the request again 
    case onFailure(e) => 
     logException(e) 
     send     // send the request again 
    } 
} 

這就是我想可能是。我怎麼能改變它,算法中有沒有錯誤?你的想法。

UPDATE:

正如我已經知道了,期貨不是專爲經常性的任務,只有一次性的。因此,他們不能在這裏使用。那我該用什麼?

回答

3

您的代碼在異常處理方面存在一些問題。如果在processResultlogException中出現異常,send將不再發生,從而打斷您的循環。這個異常也不會被記錄。更好的方法是:

f.map(processResult).onFailure(logException) 
f.onComplete(x => send()) 

這樣的send仍然發生,儘管在processResultlogException例外,從processResult異常會被記錄,而結果仍在處理下一發送可以開始中間。如果你想等到處理完成,你可以這樣做:

val f2 = f.map(processResult).recover { case e => logException(e) } 
f2.onComplete(x => send()) 
+0

但是你怎麼知道processResult和logException是否有try ... catch塊? –

+0

我不知道。這種方式我不必知道,processResult不需要自己單獨的try/catch /調用'logException',所以代碼是DRYer。 – wingedsubmariner

+0

我不認爲如果processResult和logException沒有try ... catch然後代碼DRYer。你爲什麼這麼認爲? –