SocketTimeoutException上的java jersey重试请求

时间:2016-05-15 22:17:39

标签: java jersey request jersey-2.0 jersey-client

我有一个Jersey客户端,并希望在SocketTimeoutException上实现重试,这是我在服务器日志中看到的错误。代码框架如下。 webtargetjavax.ws.rs.client.WebTarget实例,其中已定义了url路径和queryparams。我面临的问题是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
        }
    }
}

2 个答案:

答案 0 :(得分:3)

我最终弄清楚了解决方案。事实证明,SocketTimeoutException被映射到泽西客户端实际抛出的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
        }
    }
}

答案 1 :(得分:0)

这没有意义。服务器抛出SocketTimeoutException并捕获它并记录它,并向客户端返回一些HTTP错误代码。它不能向客户端抛出异常。

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