httpclient 4种关闭连接

httpclient 4种关闭连接Java代码 HttpClient client = new HttpClient();  HttpMethod method = new GetMethod("http://www.apache.org");  try {    client.executeMethod(method);    byte[] responseBody = null;        responseBody = m…

大家好,又见面了,我是你们的朋友全栈君。

Java代码 

  1. HttpClient client = new HttpClient();  
  2. HttpMethod method = new GetMethod(“http://www.apache.org”);  
  3. try {  
  4.   client.executeMethod(method);  
  5.   byte[] responseBody = null;  
  6.     
  7.   responseBody = method.getResponseBody();  
  8.     
  9. catch (HttpException e) {  
  10.   // TODO Auto-generated catch block  
  11.   e.printStackTrace();  
  12. catch (IOException e) {  
  13.   // TODO Auto-generated catch block  
  14.   e.printStackTrace();  
  15. }finally{  
  16.   method.releaseConnection();  
  17.     
  18. }  



大部分人使用HttpClient都是使用类似上面的事例代码,包括Apache官方的例子也是如此。最近我在使用HttpClient是发现一次循环发送大量请求到服务器会导致APACHE服务器的链接被占满,后续的请求便排队等待。 


我服务器端APACHE的配置 

Java代码 

  1. Timeout 30  
  2. KeepAlive On   #表示服务器端不会主动关闭链接  
  3. MaxKeepAliveRequests 100  
  4. KeepAliveTimeout 180   



因此这样的配置就会导致每个链接至少要过180S才会被释放,这样在大量请求访问时就必然会造成链接被占满,请求等待的情况。 


在通过DEBUH后发现HttpClient在method.releaseConnection()后并没有把链接关闭,这个方法只是将链接返回给connection manager。如果使用HttpClient client = new HttpClient()实例化一个HttpClient connection manager默认实现是使用SimpleHttpConnectionManager。SimpleHttpConnectionManager有个构造函数如下 

Java代码

  1. /** 
  2.  * The connection manager created with this constructor will try to keep the  
  3.  * connection open (alive) between consecutive requests if the alwaysClose  
  4.  * parameter is set to <tt>false</tt>. Otherwise the connection manager will  
  5.  * always close connections upon release. 
  6.  *  
  7.  * @param alwaysClose if set <tt>true</tt>, the connection manager will always 
  8.  *    close connections upon release. 
  9.  */  
  10. public SimpleHttpConnectionManager(boolean alwaysClose) {  
  11.     super();  
  12.     this.alwaysClose = alwaysClose;  
  13. }  



看方法注释我们就可以看到如果alwaysClose设为true在链接释放之后connection manager 就会关闭链。在我们HttpClient client = new HttpClient()这样实例化一个client时connection manager是这样被实例化的 

Java代码 

  1. this.httpConnectionManager = new SimpleHttpConnectionManager();  



因此alwaysClose默认是false,connection是不会被主动关闭的,因此我们就有了一个客户端关闭链接的方法。 


方法一:
 


把事例代码中的第一行实例化代码改为如下即可,在method.releaseConnection();之后connection manager会关闭connection 。 

Java代码 

  1. HttpClient client = new HttpClient(new HttpClientParams(),new SimpleHttpConnectionManager(true) );  



方法二:
 


实例化代码使用:HttpClient client = new HttpClient(); 


在method.releaseConnection();之后加上 

Java代码 

  1. ((SimpleHttpConnectionManager)client.getHttpConnectionManager()).shutdown();  



shutdown源代码很简单,看了一目了然 

Java代码 

  1. public void shutdown() {  
  2.     httpConnection.close();  
  3. }  



方法三:
 


实例化代码使用:HttpClient client = new HttpClient(); 


在method.releaseConnection();之后加上 


client.getHttpConnectionManager().closeIdleConnections(0);此方法源码代码如下: 

Java代码 

  1. public void closeIdleConnections(long idleTimeout) {  
  2.     long maxIdleTime = System.currentTimeMillis() – idleTimeout;  
  3.     if (idleStartTime <= maxIdleTime) {  
  4.         httpConnection.close();  
  5.     }  
  6. }  



将idleTimeout设为0可以确保链接被关闭。 


以上这三种方法都是有客户端主动关闭TCP链接的方法。下面再介绍由服务器端自动关闭链接的方法。 


方法四:
 


代码实现很简单,所有代码就和最上面的事例代码一样。只需要在HttpMethod method = new GetMethod(“http://www.apache.org”);加上一行HTTP头的设置即可 

Java代码 

  1. method.setRequestHeader(“Connection”“close”);  



看一下HTTP协议中关于这个属性的定义: 


HTTP/1.1 defines the “close” connection option for the sender to signal that the connection will be closed after completion of the response. For example, 


       Connection: close 


现在再说一下客户端关闭链接和服务器端关闭链接的区别。如果采用客户端关闭链接的方法,在客户端的机器上使用netstat –an命令会看到很多TIME_WAIT的TCP链接。如果服务器端主动关闭链接这中情况就出现在服务器端。 


参考WIKI上的说明http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions 


The TIME_WAIT state is a protection mechanism in TCP. The side that closes a socket connection orderly will keep the connection in state TIME_WAIT for some time, typically between 1 and 4 minutes. 


TIME_WAIT的状态会出现在主动关闭链接的这一端。TCP协议中TIME_WAIT状态主要是为了保证数据的完整传输。具体可以参考此文档: 


http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.7 


另外强调一下使用上面这些方法关闭链接是在我们的应用中明确知道不需要重用链接时可以主动关闭链接来释放资源。如果你的应用是需要重用链接的话就没必要这么做,使用原有的链接还可以提供性能。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163249.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [HOWTO] 扩展 Windows Server 2008 的评估期限

    [HOWTO] 扩展 Windows Server 2008 的评估期限

    2022年3月12日
    43
  • 云服务器需要备案吗(国内服务器免备案方法)

    国内不需要备案的服云服务器内容精选换一换不想看文字,请直接戳视频链接。可以不做备案吗?根据《互联网信息服务管理办法》等相关规定,使用中国大陆节点服务器开办的网站,必须先办理网站备案,备案成功并获取通信管理局下发的ICP备案号后才能开通访问。根据《互联网信息服务管理办法》等相关规定,使用中国大陆节点服务器开办的网站,必须先办理网站备案,备案成功并获取通信管理局下发的ICP备案号后视频点播不需要购买…

    2022年4月14日
    106
  • TypeError: ‘Collection‘ object is not callable. If you meant to call the ‘insert‘ method on a ‘Datab

    TypeError: ‘Collection‘ object is not callable. If you meant to call the ‘insert‘ method on a ‘DatabfrompymongoimportMongoClient报错问题描述解决方法问题描述使用pymongo连接本地的MongoDB,跟个老师的视频,出现报错,后查询资料改正frompymongoimportMongoClient#创建数据库连接对象client=MongoClient()#选择一个数据库db=client[‘python’]#身份认证#db.authenticate(‘python’,’python’)#选择一个集合col=c

    2022年7月16日
    23
  • linux直接运行py文件_linux的系统调用

    linux直接运行py文件_linux的系统调用python下编译py成pyc和pyo(文件加密)需要注意的是,编译成pyc或者pyo文件后需要将命名改成与源Python命名一致,将其放在源目录下,虽然其他python文件调用pyd时显示不能检测到该模块,但实际上可以运行。由于pyc的编译收到python版本的影响,所以当将编译后的pyc迁移到另一台电脑中时,最好保持python环境一致。将python文件.py编译成pyc二进制文件:pyt…

    2022年10月24日
    0
  • mysql 驱动jar包下载_mysql驱动jar包

    mysql 驱动jar包下载_mysql驱动jar包mysql驱动就是赋值外界与数据的连接接口。请注意JDBC连接MySql,其驱动程序与MySQL的版本有关!!要使用相匹配的驱动程序,并将驱动程序加到CLASSPATH中。在系FTP服务器上,/数据库/MySql目录下的驱动程序如下:MySql5.0 驱动程序包为mysql-connector-java-5.0.4.zip(内有.jar文件即驱动程序)MySql4.0 驱动程序为mysqldriv…

    2022年5月22日
    91
  • Oracle-Oracle数据库备份与恢复

    Oracle-Oracle数据库备份与恢复Oracle数据库备份与恢复下面通过一些简单的例子来了解一下:Oracle数据库各种物理备份的方法。Oracle数据库各种物理恢复的方法利用RMAN工具进行数据库的备份与恢复。数据的导出与导入操作。(1)关闭BOOKSALES数据库,进行一次完全冷备份。selectfile_namefromdba_data_files;selectmemberfromv…

    2022年5月14日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号