tomcat中close_wait不释放导致tomcat频繁假死
tomcat 中close_wait 不释放导致tomcat频繁假死
遇到的问题
报错信息
解决方案
遇到的问题
最近自己做了一个小程序项目发现在发布后tomcat 过一段时间后就假死,一开始查询了了用户量发现用户一天登陆3000+以为是用户量的问题,我修改了tomcat 配置,增大了访问量的线程,可是发现到了晚上有挂了,查询线程后发现,连接被close_wait 沾满,且close_wait 不断增加,最后tomcat无法访问
报错信息
解决方案
单从报错信息可以看出是 443 端口的问题,我443 配置了https,我一开始以为是https 的配置,查了文档发现配置没有问题,网上查询说的httpClient 没有关闭 查询了我的代码 ,把没有的close 的httpClient 全部加上close ,发现还是无效,崩溃。继续找解决方案,但是tomcat 抗不住老是爆炸,只能一次次重启中度日,找大神问(这里特别感谢下咕泡学院的Mic老师),大神指导说你的httpClient 没关,可是事实是我关了,但是这时候我截日志的是否发现了一个异常这个异常在项目运行,甚至假死的状态的都不会抛出,但是在关闭tomcat 的时候会抛出,定位到代码 发现是取小程获取openid 的时候socket 问题,但是我httpclient 关闭了,为啥这个连接还保持着,找HttpClient 相关文档,发现我的HttpClient 未做时间限制,下面列出修改前后的代码
修改前的代码:
private static HttpResponse sendRequest(DefaultHttpClient httpclient,
HttpUriRequest httpost) {
logger.info("execute post...");
HttpResponse response = null;
try {
response = httpclient.execute(httpost);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
修改后的的代码:
private static HttpResponse sendRequest(DefaultHttpClient httpclient,
HttpUriRequest httpost) {
logger.info("execute post...");
HttpResponse response = null;
try {
httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,4000);//连接时间
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,4000);
response = httpclient.execute(httpost);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
httpost.abort();
httpclient.close();
}
return response;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
改好发布,发现异常锐减,修改前的方法是网上直接复制的, httpclient 方法没有加 连接时间和超时时间 自己测试发现没有就粘上去发布,实际应用生产的时候出了问题,坑坑坑,到了这一步发现之前对httpClient还有很多需要优化的地方,找了资料,把方法重写
最终版:
public static String post(String url, Map<String, String> params) {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
String body = null;
StringBuffer paramsd = new StringBuffer();
paramsd.append("appid=" + params.get("appid"));
paramsd.append("&");
paramsd.append("secret=" + params.get("secret"));
paramsd.append("&");
paramsd.append("js_code=" + params.get("js_code"));
paramsd.append("&");
paramsd.append("grant_type=" + params.get("grant_type"));
HttpGet httpGet = new HttpGet(url + "?" + paramsd);
// 响应模型
CloseableHttpResponse response = null;
try {
// 配置信息
RequestConfig requestConfig = RequestConfig.custom()
// 设置连接超时时间(单位毫秒)
.setConnectTimeout(4000)
// 设置请求超时时间(单位毫秒)
.setConnectionRequestTimeout(4000)
// socket读写超时时间(单位毫秒)
.setSocketTimeout(4000)
// 设置是否允许重定向(默认为true)
.setRedirectsEnabled(true).build();
// 将上面的配置信息 运用到这个Get请求里
httpGet.setConfig(requestConfig);
// 由客户端执行(发送)Get请求
response = httpClient.execute(httpGet);
// 从响应模型中获取响应实体
HttpEntity responseEntity = response.getEntity();
// System.out.println("响应状态为:" + response.getStatusLine());
if (responseEntity != null) {
return EntityUtils.toString(responseEntity);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return body;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
发布 问题解决,这个文章对高手来说可能一文不值,但是我觉得我要记下来为后来同样遇到这个问题的哥们提供一个可能解决方案。
————————————————
版权声明:本文为CSDN博主「zhang4852898」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhang4852898/java/article/details/91607636
以上是 tomcat中close_wait不释放导致tomcat频繁假死 的全部内容, 来源链接: utcz.com/z/518058.html