我这样写,但仍然收到错误消息:“与XXX的连接已泄漏。您是否忘了关闭响应正文?”

时间:2019-09-16 10:00:23

标签: java okhttp

我不知道如何避免,我已经关闭了响应正文!

有人可以帮我解决这个问题吗?

我的代码:

public String getPageFromServer(String activityKey) throws Exception {
    String address = pageServerHolder.getServerAddressRandom();

    String url = MessageFormat.format(URL, address, activityKey);
    log.debug("=============== url [{}] ================", url);

    OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(60, TimeUnit.SECONDS).callTimeout(1, TimeUnit.SECONDS).build();
    final Request request = new Request.Builder().url(url).get().build();

    Response response = client.newCall(request).execute();

    try (ResponseBody body = response.body()) {
        if (response.isSuccessful() && null != body) {
            String bodyString = body.string();
            if (StringUtils.isNotBlank(bodyString)) {
                body.close();
                return bodyString;
            }
        }
    }
    throw new RuntimeException(MessageFormat.format("获取活动页信息异常,url [{0}], response.code [{1}],response.message [{2}] ", url, response.code(), response.message()));
}

3 个答案:

答案 0 :(得分:1)

您的问题是Response没有关闭。您的代码应如下所示:

try (Response response = client.newCall(request).execute();
     ResponseBody body = response.body()) {
    if (response.isSuccessful() && null != body) {
        String bodyString = body.string();
        if (StringUtils.isNotBlank(bodyString)) {
            return bodyString;
        }
    }
}

我不确定您是否需要关闭ResponseBody。关闭response可能会处理它。但是,冗余关闭几乎没有危害。


在此处查看示例:https://square.github.io/okhttp/

答案 1 :(得分:0)

ResponseBody实现Closeable接口。您正在try块的资源部分中创建ResponseBody,当您离开try块时,它将为您关闭。

您的“ body.close()”不应该存在。

答案 2 :(得分:0)

    try (Response response = httpClient.newCall(request).execute();
         ResponseBody responseBody = response.body()) {
      if (response.isSuccessful()) {
        log.info("access tree from {} success", url);
        return objectMapper.readValue(responseBody.string(), StorageTreeResponse.class);
      } else {
        return null;
      }
    } catch (IOException e) {
      e.printStackTrace();
      return null;
    }

我想知道这只是来自okhttp客户端的错误。甚至try resource语法也不能解决警告。