2016-05-15 63 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

为什么你认为只能在服务器上抛出异常? –