SocketTimeoutException上的java jersey重试请求

SocketTimeoutException上的java jersey重试请求,java,jersey,request,jersey-2.0,jersey-client,Java,Jersey,Request,Jersey 2.0,Jersey Client,我有一个Jersey客户端,希望在SocketTimeoutException时实现重试,这是我在服务器日志中看到的错误。下面是代码框架webtarget是一个javax.ws.rs.client.webtarget实例,其url路径和查询参数已经定义。我面临的问题是webtarget.request.get()从不抛出任何SocketTimeoutException,因此我实际上无法捕获此异常。有没有想过如何真正实现重试 int i = 0; Response response; while

我有一个Jersey客户端,希望在
SocketTimeoutException
时实现重试,这是我在服务器日志中看到的错误。下面是代码框架
webtarget
是一个
javax.ws.rs.client.webtarget
实例,其url路径和查询参数已经定义。我面临的问题是
webtarget.request.get()
从不抛出任何SocketTimeoutException,因此我实际上无法捕获此异常。有没有想过如何真正实现重试

int i = 0;
Response response;
while (true) {
    try {
        response = webtarget.request().get();
        break;
    } catch (SocketTimeoutException e){
        if (i < retryNumber) {
            i++;
        } else {
            // throws some exception
        }
    }
}
inti=0;
反应;
while(true){
试一试{
response=webtarget.request().get();
打破
}捕获(SocketTimeoutException e){
如果(i
这毫无意义。服务器抛出
SocketTimeoutException
,捕获它,记录它,并向客户端返回一些HTTP错误代码。它不能向客户端抛出异常


您需要观察返回的HTTP错误代码,然后在此条件下重试。

我最终找到了解决方案。事实证明,
SocketTimeoutException
映射到了一个
ProcessingException
,该异常实际上是由Jersey客户端引发的。所以下面的代码起作用了

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
        }
    }
}
inti=0;
反应;
while(true){
试一试{
response=webtarget.request().get();
打破
}捕获(处理异常e){
if(例如,getCause()instanceof SocketTimeoutException&&i
为什么您认为异常只能在服务器上引发?您不想增加请求的客户端超时以避免套接字超时异常本身。