2013-11-27 171 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。你为什么这么认为? –