2016-11-28 48 views
0

下面是我的方法:WSRequest重試次數

def buildWSRequest(url: String, accessToken: String, wsClient: WSClient) 
    : (WSRequest, WSResponse) = { 
    import AppImplicits._ 
    val d1 = new java.util.Date() 
    val request: WSRequest = wsClient.url(url) 
     .withHeaders("Authorization" -> ("Bearer " + accessToken)) 
     .withHeaders("Content-type" -> "application/json", "Accept" -> "application/json; charset=utf-8") 


    var response: WSResponse = null 
    try { 
     val future = request.get() 

     response = scala.concurrent.Await.result(future, duration) 

    } catch { 
     case ex: Throwable => throw ex.getCause 
    } 
    return (request, response) 
    } 

而我打電話的部分是:

var response: WSResponse = buildWSRequest("www.sampletest123.com", params.apply("accessToken").asInstanceOf[String], sslClient)._2 

我想再試wsRequestn次,該怎麼做?

+0

https://gist.github.com/viktorklang/9414163 –

回答

0

未來重試n次UTIL未來成功

def retry[T](future: => Future[T])(retries: Int)(implicit ec: ExecutionContext): Future[T] = { 
    val promise = Promise[T]() 
    try { 
     val f = future 
     f onSuccess { case result => promise trySuccess result} 
     f onFailure { case th => 
     if (retries > 0) promise tryFailure th 
     else retry(future)(retries - 1) 
     } 
    } catch { 
     case th: Throwable => promise tryFailure th 
    } 
    promise.future 
    } 

retry需要將來的代碼塊由名稱參數調用,然後運行未來。未來的計算會重試n次直到成功。

首先承諾是創造,並且未來返回給用戶。然後,承諾的完成取決於給予未來的用戶。如果使用給定的將來是成功的,那麼它將立即返回,如果沒有重試直到重試計數耗盡。最終,承諾完全取決於成功還是失敗,取決於剩餘的重試次數以及未來是否成功。另外需要注意的一點是,未來的計算可能會失敗。所以使用try catch塊來處理失敗。

重試方法通常可用於任何未來。

進行這些更改現有的代碼才能利用重試方法

def buildWSRequest(url: String, accessToken: String, wsClient: WSClient): Future[WSReponse] = { 
    wsClient.url(url) 
     .withHeaders("Authorization" -> ("Bearer " + accessToken)) 
     .withHeaders("Content-type" -> "application/json", "Accept" -> "application/json; charset=utf-8") 
     .get 
    } 

使用

val requestFuture: Future[WSRequest] = buildWSRequest(....) 
retry(requestFuture)(5) 

尼斯API使用隱式類語法

implicit class FutureUtils[T](future: => Future[T]) { 
    def retry(retries: Int): Future[T] = { 
     val promise = Promise[T]() 
     try { 
     val f = future 
     f onSuccess { case result => promise trySuccess result } 
     f onFailure { case th => 
      if (retries > 0) promise tryFailure th 
      else retry(retries - 1) 
     } 
     } catch { 
     case th: Throwable => promise tryFailure th 
     } 
     promise.future 
    } 
    } 

使用隱式類,您現在可以使用重試函數,就好像它在Future類/接口中聲明的那樣,而不是將未來代碼塊作爲函數參數傳遞。

Future(doSomething).retry(10) 

一般建議

不要擋住

使用返回類型溝通,外界