代码之家  ›  专栏  ›  技术社区  ›  jamesw1234

SocketTimeoutException上的java jersey重试请求

  •  1
  • jamesw1234  · 技术社区  · 10 年前

    我有一个Jersey客户端,希望在上实现重试 SocketTimeoutException ,这是我在服务器日志中看到的错误。代码框架如下。 webtarget 是一个 javax.ws.rs.client.WebTarget 已定义url路径和queryparam的实例。我面临的问题是 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 回复  |  直到 10 年前
        1
  •  4
  •   jamesw1234    10 年前

    我最终找到了解决办法。结果是 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
            }
        }
    }
    
        2
  •  0
  •   user207421    10 年前

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

    您需要观察返回的HTTP错误代码,然后在这种情况下重试。