2016-05-15 57 views
1

我有一個Jersey客戶端,想要在SocketTimeoutException上執行重試,這是我在服務器日誌中看到的錯誤。代碼框架如下。 webtarget是一個javax.ws.rs.client.WebTarget實例,URL路徑和queryparams已經定義。我面臨的問題是webtarget.request.get()從不拋出任何SocketTimeoutException,所以我實際上無法捕獲這個異常。任何想法如何我可以實際執行重試?SocketTimeoutException上的java球衣重試請求

int i = 0; 
Response response; 
while (true) { 
    try { 
     response = webtarget.request().get(); 
     break; 
    } catch (SocketTimeoutException e){ 
     if (i < retryNumber) { 
      i++; 
     } else { 
      // throws some exception 
     } 
    } 
} 
+0

你不想增加一個請求的客戶端超時,以避免套接字超時異常本身。 –

回答

2

我最終找出瞭解決方案。事實證明,SocketTimeoutException被映射到Jersey客戶端實際拋出的ProcessingException。所以下面的代碼工作

int i = 0; 
Response response; 
while (true) { 
    try { 
     response = webtarget.request().get(); 
     break; 
    } catch (ProcessingException e){ 
     if (e.getCause() instanceof SocketTimeoutException && i < retryNumber) { 
      i++; 
     } else { 
      // throws some exception 
     } 
    } 
} 
0

這沒有意義。服務器拋出SocketTimeoutException,並捕獲並記錄它,並向客戶端返回一些HTTP錯誤代碼。它不能向客戶端拋出異常。

您需要觀察返回的HTTP錯誤代碼,然後在該條件下重試。

+0

爲什麼你認爲只能在服務器上拋出異常? –