java.lang.IllegalStateException: Connection pool shut down

最近使用HttpClient 4.5 使用 CloseableHttpClient 发起连接后,使用CloseableHttpResponse 接受返回结果,结果就报错了,上网查了下,有位stackoverflow的大兄弟说,只要将:

 CloseableHttpClient httpClient    = HttpClients.createDefault();
改为:
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).setConnectionManagerShared(true).build();

就可以整正常执行了,于是,用之,果然不报错了,但是为什么呢?以下是大兄弟的原文解释:

I was having a similar error when I came across this thread and this seemed to fix the issue for me. I know this is an old question, but adding thoughts for others for future reference.

I'm not 100% sure as to why this fix works as the documentation around this is pretty awful. It was a lot of trial and error with what I was testing to get to this solution. From what I can

gather though, this fix works because it is then using a shared connection pool in the background, which means that connections remain open for use.

关键是最后一句话:大概意思是,后台使用一个共享连接池,供剩下打开的连接去使用

 

原文地址:https://stackoverflow.com/questions/41744410/executorservice-performing-rest-requests

感谢下这位大兄弟

 

apache 官方的建议是,创建连接池,并为每一个接口URL分配一个线程,去执行,还给出了许多高并发访问的编码技巧

原文:https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

那么,使用HttpClient 4.5连接池的正确姿势是什么呢?

原作者地址:https://my.oschina.net/xlj44400/blog/711341

 

摘要: HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议

HttpClient简介

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient支持的功能如下:

  • 支持Http0.9、Http1.0和Http1.1协议。
  • 实现了Http全部的方法(GET,POST,PUT,HEAD 等)。
  • 支持HTTPS协议。
  • 支持代理服务器。
  • 提供安全认证方案。
  • 提供连接池以便重用连接。
  • 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
  • 在http1.0和http1.1中利用KeepAlive保持长连接。

以前是commons-httpclient,后面被Apache HttpComponents取代,目前版本4.5.x,我们现在用的就是4.5版本

HttpClient连接池使用

为什么要用Http连接池:

1、降低延迟:如果不采用连接池,每次连接发起Http请求的时候都会重新建立TCP连接(经历3次握手),用完就会关闭连接(4次挥手),如果采用连接池则减少了这部分时间损耗2、支持更大的并发:如果不采用连接池,每次连接都会打开一个端口,在大并发的情况下系统的端口资源很快就会被用完,导致无法建立新的连接
  • 默认http协议:
private static final Charset CHAR_SET = Charset.forName("utf-8");
private static PoolingHttpClientConnectionManager cm;public void init() {cm = new PoolingHttpClientConnectionManager();cm.setMaxTotal(50);cm.setDefaultConnectionConfig(ConnectionConfig.custom().setCharset(CHAR_SET).build());SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(30000).setSoReuseAddress(true).build();cm.setDefaultSocketConfig(socketConfig);// HttpProtocolParams.setContentCharset(httpParams, "UTF-8");// HttpClientParams.setCookiePolicy(httpParams, "ignoreCookies");// HttpConnectionParams.setConnectionTimeout(httpParams, 30000);// HttpConnectionParams.setSoTimeout(httpParams, 30000);httpClient = HttpClientBuilder.create().setConnectionManager(cm).build();}public CloseableHttpClient getHttpClient() {int timeout=2;RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000) //设置连接超时时间,单位毫秒//.setConnectionRequestTimeout(timeout * 1000) //设置从connect Manager获取Connection 超时时间,单位毫秒.setSocketTimeout(timeout * 1000).build(); //请求获取数据的超时时间,单位毫秒CloseableHttpClient _httpClient = HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(config).build();if(cm!=null&&cm.getTotalStats()!=null) { //打印连接池的状态		LOGGER.info("now client pool {}",cm.getTotalStats().toString());}return _httpClient;}public String post(String url, Map<String, String> params) {HttpPost post = new HttpPost(url);String resp = null;try {if(params != null){List<NameValuePair> nvps = new ArrayList<NameValuePair>();for (Map.Entry<String, String> param : params.entrySet()) {nvps.add(new BasicNameValuePair(param.getKey(), param.getValue()));}post.setEntity(new UrlEncodedFormEntity(nvps, CHAR_SET));}try {HttpResponse response = httpClient.execute(post);InputStream input = response.getEntity().getContent();resp = IOUtils.toString(input);} catch (ClientProtocolException e) {LOGGER.error(e.getMessage(), e);} catch (IOException e) {LOGGER.error(e.getMessage(), e);} catch (Exception e) {LOGGER.error(e.getMessage(), e);}} finally {if (post != null)post.releaseConnection();}return resp;}
  • https协议:
public class HttpConnectionManager {PoolingHttpClientConnectionManager cm = null;public void init() {LayeredConnectionSocketFactory sslsf = null;try {sslsf = new SSLConnectionSocketFactory(SSLContext.getDefault());} catch (NoSuchAlgorithmException e) {e.printStackTrace();}Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslsf).register("http", new PlainConnectionSocketFactory()).build();cm =new PoolingHttpClientConnectionManager(socketFactoryRegistry);cm.setMaxTotal(200);cm.setDefaultMaxPerRoute(20);}public CloseableHttpClient getHttpClient() {       CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();          /*//如果不采用连接池就是这种方式获取连接CloseableHttpClient httpClient = HttpClients.createDefault();*/return httpClient;}
}
  • httpClient使用
catch (Exception e) {logger.error("ufile send error e:",e);try {if (resEntity != null && resEntity.getContent() != null) {resEntity.getContent().close();}} catch (IllegalStateException | IOException e1) {logger.error("ufile send error e1:",e1);} finally {if (getMethod!=null) {getMethod.releaseConnection();}/*if (httpClient!=null) { //连接池使用的时候不能关闭连接,否则下次使用会抛异常 java.lang.IllegalStateException: Connection pool shut downtry {httpClient.close();} catch (IOException e2) {logger.error("ufile httpclient close error e2:",e2);}}*/}}
  • 连接池使用注意事项:
    1. 连接池中连接都是在发起请求的时候建立,并且都是长连接2. HttpResponse input.close();作用就是将用完的连接释放,下次请求可以复用,这里特别注意的是,如果不使用in.close();而仅仅使用httpClient.close();结果就是连接会被关闭,并且不能被复用,这样就失去了采用连接池的意义。3. 连接池释放连接的时候,并不会直接对TCP连接的状态有任何改变,只是维护了两个Set,leased和avaliabled,leased代表被占用的连接集合,avaliabled代表可用的连接的集合,释放连接的时候仅仅是将连接从leased中remove掉了,并把连接放到avaliabled集合中
    

打印的状态:

INFO c.m.p.u.h.HttpClientUtils[72] - now client pool [leased: 0; pending: 0; available: 0; max: 50]

leased :the number of persistent connections tracked by the connection manager currently being used to execute requests.  available :the number idle persistent connections.  pending : the number of connection requests being blocked awaiting a free connection.  max: the maximum number of allowed persistent connections.  

HttpClient 4.5超时设置

4.5版本中,这两个参数的设置都抽象到了RequestConfig中,由相应的Builder构建,具体的例子如下:

CloseableHttpClient httpclient = HttpClients.createDefault();  
HttpGet httpGet = new HttpGet("http://stackoverflow.com/");  
RequestConfig requestConfig = RequestConfig.custom()  .setConnectTimeout(5000).setConnectionRequestTimeout(1000)  .setSocketTimeout(5000).build();  
httpGet.setConfig(requestConfig);  
CloseableHttpResponse response = httpclient.execute(httpGet);  
System.out.println("得到的结果:" + response.getStatusLine());//得到请求结果  
HttpEntity entity = response.getEntity();//得到请求回来的数据
  • setConnectTimeout:设置连接超时时间,单位毫秒。ConnectTimeoutException
  • setConnectionRequestTimeout:设置从connect Manager获取Connection 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。ConnectionPoolTimeout
  • setSocketTimeout:请求获取数据的超时时间,单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。SocketTimeoutException
  • 上面3个时间4.5版本默认是-1,就是不限,如果不设置就会一直等待

转载于:https://www.cnblogs.com/Eillot/p/9042284.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物资管理系统c语言课程设计,C语言实现仓库物资管理系统

前言此系统为博主大一上学期C语言课程设计的大作业&#xff0c;由于当时初步接触C语言&#xff0c;现在来看程序写的太烂了&#xff0c;简直不忍直视……但是还是想通过博客的形式记录下来&#xff0c;也可以给刚接触学习C语言的人一些参考吧&#xff01;系统功能设计仓库初始化…

模板方法模式–使用Lambda表达式,默认方法

模板方法模式是Erich Gamma&#xff0c;Richard Helm&#xff0c;Ralph Johnson和John Vlissides在著名的《 设计模式》一书中解释的23种设计模式之一。 这种模式的意图表示为&#xff1a; 在操作中定义算法的框架&#xff0c;将某些步骤推迟到子类。 TemplateMethod允许子类重…

DOM元素属性值如果设置为对象

结论&#xff1a;内部会调用toString方法&#xff0c;将设置的对象转换为字符串添加给相应的属性&#xff1b; 这个问题呢&#xff0c;是通过jQuery的each方法中&#xff0c;回调函数的this指向问题而来&#xff1b; 我们知道&#xff0c;回调函数中的this如果指向的是基本数据…

纯CSS3美化单选按钮radio

这种纯CSS3美化单选按钮radio的方法适用于以下情况&#xff1a; 1、可兼容IE9以上&#xff0c;需要兼容IE8的要写IE的hack把样式去掉 2、只支持单选按钮radio&#xff0c;因为单选按钮选中样式的圆圈可以用CSS做出来&#xff0c;但是复选按钮checkbox的选中效果对勾就需要图片…

【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路

在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士&#xff0c;他是部落的中坚力量有一天他醒来后发现自己居然到了联盟的主城暴风城在被众多联盟的士兵攻击后&#xff0c;他决定逃回自己的家乡奥格瑞玛 题目背景【题目描述&#xff1a;】 在艾泽拉斯&#xff0c;有n个城市。编号为1…

模拟智能手环的时间显示功能 c语言,HT1635AHT1635B在穿戴式运动手环的LED显示之C语言版.PDF...

HT1635AHT1635B在穿戴式运动手环的LED显示之C语言版.PDFHT1635A/HT1635B 在穿戴式运动手环的LED 显示之C 语言版应用范例HT1635A/HT1635B 在穿戴式运动手环的LED 显示之C 语言版应用范例文件编码&#xff1a;AN0443S简介HT1635A/HT1635B是HOLTEK开发的一款带显示数据映像储存器…

训练残骸模式– Java 8中的改进实现

Venkat Subramaniam在今天的演讲中提到了有关“级联方法”模式或“火车残骸”模式的内容&#xff0c;如下所示&#xff1a; >someObject.method1().method2().method3().finalResult()很少有人会将此与构建器模式相关联&#xff0c;但事实并非如此。 无论如何&#xff0c;让…

px、em、pt之间的区别与互相转换

关于px、pt和em的区别&#xff0c;自己有时候也会纠结到底该用什么单位&#xff0c;今天特意查了一些文章&#xff0c;下面这篇虽然很久远了&#xff0c;但解释的比较全面&#xff0c;转载收藏之。点击查看原文&#xff08;原网址已失效&#xff0c;这是其他站点&#xff09; …

3.Apache ZooKeeper数据模型

1. ZooKeeper自下向上的服务视图 Apache ZooKeeper是分布式应用程序的协调服务。 它旨在解决分布式应用程序中与组件协调相关的棘手问题。 它通过暴露一个简单而强大的接口来实现这一点。 应用程序可以设计在通过ZooKeeper API实现的这些接口上&#xff0c;以解决分布式同步&am…

STS插件_ springsource-tool-suite插件各个历史版本

目前spring官网(http://spring.io/tools/sts/all)上可下载的spring插件只有&#xff1a;springsource-tool-suite-3.8.4(sts-3.8.4)。但这只针对指定的eclipse版本适用。 原贴更精彩&#xff1a;http://blog.csdn.net/u010203767/article/details/69211072 sts-3.8.3的下载地址…

c语言中空格的占位符,HTML空格占位符

ScrollView 里的 EditText 与输入法的用例情景是这样的: 我希望页面可以滚动,因为长页面,内容多,必须滚动来满足不同手机的显示 点击 EditText 输入法弹出来,并将布局顶起来,并且EditText有足够的显示空间 进入页面时,输入法不能 ...decltype在C中,decltype作为操作符,用于查询…

仔细看看,您会发现需要改进的地方

我建议您做一个练习&#xff1a;明天早上返回工作时&#xff0c;浏览项目的源代码&#xff0c;并尝试寻找重构的机会。 即使您的老板不要求也这样做。 这样做是因为您想要一些激动人心的工作时间。 重构是改变已经可以正常工作的艺术 。 但是要进行重构&#xff0c;您需要一个…

idea运行项目时报Error:java无效的源发行版:1.8

如果你安装的是JDK1.7&#xff0c;而在file->project structure中设置的是language level是8的话&#xff0c;就会出现这个错误提示&#xff1a;无效的源发行版&#xff1a;8。 解决办法&#xff1a;将语言级别改为7&#xff0c;或6。即语言级别不能高于你安装的版本。 另外…

0x123C语言,and esp, 0xfffffff0

问题I dont entirely understand the line with comment in it below. I read a few posts on SO and in the gcc manual and learned that it is for stack address alignment but fail to understand how it does so. The code is show below:(gdb) disas mainDump of assemb…

JUnit:在参数化测试中命名单个测试用例

几年前&#xff0c;我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例&#xff0c;因此&#xff0c;如果它们失败&#xff0c;您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思&#xff1a; 但是&#…

如何在 React Native 中写一个自定义模块

前言 在 React Native 项目中可以看到 node_modules 文件夹&#xff0c;这是存放 node 模块的地方&#xff0c;Node.js 的包管理器 npm 是全球最大的开源库生态系统。提到npm&#xff0c;一般指两层含义&#xff1a;一是 Node.js 开放式模块登记和管理系统&#xff0c;另一种是…

小程序canvasu真机上数据图片不能使用

canvas遇到的坑 1.文字换行 2.真机不能使用网络数据图片&#xff08;真坑&#xff09; 点击显示效果我就不写了&#xff0c;你们可以自己加一下 全部代码贴出来 css#preview {width: 100%;height: 100%;background: rgba(0, 0, 0, 0.6);position: fixed;z-index: 999;top: 0;ov…

c语言 两条线段位置,C++/STL实现判断平面内两条线段的位置关系代码示例

概念平面内两条线段位置关系的判定在很多领域都有着广泛的应用&#xff0c;比如游戏、CAD、图形处理等&#xff0c;而两线段交点的求解又是该算法中重要的一环。本文将尽可能用通俗的语言详细的描述一种主流且性能较高的判定算法。外积&#xff0c;又称叉积&#xff0c;是向量代…

Thunder团队Beta周贡献分规则

小组名称&#xff1a;Thunder 项目名称&#xff1a;i阅app 组长&#xff1a;王航 成员&#xff1a;李传康、翟宇豪、邹双黛、苗威、宋雨、胡佑蓉、杨梓瑞 分配规则 规则1&#xff1a;基础分&#xff0c;拿出总分的20%&#xff08;8分&#xff09;进行均分&#xff0c;剩下的80%…

SiftingAppender:将不同的线程记录到不同的日志文件中

Logback的一项新颖功能是SiftingAppender &#xff08; JavaDoc &#xff09;。 简而言之&#xff0c;它是一个代理附加器&#xff0c;它为给定运行时属性的每个唯一值创建一个子附加器。 通常&#xff0c;此属性来自MDC 。 这是基于上面链接的官方文档的示例&#xff1a; <…