Apache HttpClient 资源释放、请求超时,导致线程池用光、内存不足
来源:互联网 发布:java发送邮件 多邮箱 编辑:程序博客网 时间:2024/06/01 08:19
Apache HttpClient,据说很强大,可以支持峰值一秒7万以上的请求。不过需要注意一些资源释放和超时处理的问题。
问题1:线程资源无法释放,最终导致内存不足、或线程池被用光。
问题代码:
private static HttpClient httpClient = HttpClientBuilder.create().build();private void sendHttpPost(String httpUrl, Object body) { try { HttpPost request = new HttpPost(httpUrl); StringEntity params = new StringEntity(new ObjectMapper().writeValueAsString(body), "UTF-8"); request.addHeader("content-type", "application/json"); request.setEntity(params); httpClient.execute(request); //问题代码 } catch (Exception ex) { logger.error("Http post error. body={}", body, ex); }}
原因:httpClient.execute()执行的返回值response没有被close,导致线程一直在等待。
解决:改用CloseableHttpClient,并保证httpClient.execute()执行的response最终被close掉。而httpClient无需close,可以重复使用。
改正后的代码:
//private static HttpClient httpClient = HttpClientBuilder.create().build();private static CloseableHttpClient httpClient = HttpClientBuilder.create().build();private void sendHttpPost(String httpUrl, Object body) { try { HttpPost request = new HttpPost(httpUrl); StringEntity params = new StringEntity(new ObjectMapper().writeValueAsString(body), "UTF-8"); request.addHeader("content-type", "application/json"); request.setEntity(params); //httpClient.execute(request); try (CloseableHttpResponse response = httpClient.execute(request)) { //response.close()会被自动调用 //result = this.extractResultInfo(response); }catch (Exception ex) { logger.error("Http post execute error. body={}", body, ex); } } catch (Exception ex) { logger.error("Http post error. body={}", body, ex); }}
问题2:如果使用HttpClient访问外部url,有时候会出现连接超时或应答超时的情况。如果没有超时处理,也会导致内存不足、或线程池被用光。
问题代码:如上。
解决:创建httpClient时,设置几个timeout时间:
//private static HttpClient httpClient = HttpClientBuilder.create().build();private static CloseableHttpClient httpClient;// = HttpClientBuilder.create().build(); //no timeout handling...static { RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); //客户端和服务器建立连接的timeout requestConfigBuilder.setConnectTimeout(30000); //从连接池获取连接的timeout requestConfigBuilder.setConnectionRequestTimeout(30000); //连接建立后,request没有回应的timeout requestConfigBuilder.setSocketTimeout(30000); HttpClientBuilder clientBuilder = HttpClientBuilder.create(); clientBuilder.setDefaultRequestConfig(requestConfigBuilder.build()); clientBuilder.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(30000).build()); //连接建立后,request没有回应的timeout clientBuilder.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy()); httpClient = clientBuilder.build();}
阅读全文
1 0
- Apache HttpClient 资源释放、请求超时,导致线程池用光、内存不足
- 设置Apache的HttpClient请求时间超时
- 使用HttpClient不设置超时将导致线程永久等待
- httpclient超时请求
- HttpClient中的请求超时
- HttpClient连接请求超时设置
- HttpClient连接请求超时设置
- HttpClient设置请求超时和读取超时
- HttpClient的请求超时和响应超时
- httpclient连接池释放异常和多余资源
- 线程资源释放
- 线程结束资源释放
- 线程资源释放
- 线程结束资源释放
- 线程资源释放 问题解决
- android的HttpClient添加请求超时时间
- httpClient请求超时的设置以及处理
- android的HttpClient添加请求超时时间
- HDU1005Number Sequence
- Activity did not call finish() prior to onResume() completing原因和解决办法
- Vue(2) : Vue for Gank.io
- 算法系列—— Find Peak Element
- 调用WebService接口的方法
- Apache HttpClient 资源释放、请求超时,导致线程池用光、内存不足
- thinkphp网站支付宝异步回调验签失败问题,发现一个原因点
- Android绘图基础--Surface创建及初始化
- Xamarin for Visual Studio v4.6发布,重新设计属性页和Manifest编辑器
- 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)
- java 遍历map的方式
- Going deeper with convolutions-GoogLeNet(阅读)
- formdata ajax上传文件前后台代码
- Linux cut命令