我不知道如何避免,我已经关闭了响应正文!
有人可以帮我解决这个问题吗?
我的代码:
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()));
}
答案 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
语法也不能解决警告。