当前位置: 首页 >服务端 > java httpclient 关闭

java httpclient 关闭

Java代码HttpClient client = new HttpClient();

HttpMethod method = new GetMethod("http://www.apache.org");

try {

client.executeMethod(method);

byte[] responseBody = null;

responseBody = method.getResponseBody();

} catch (HttpException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

method.releaseConnection();

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

Java代码Timeout 30

KeepAlive On   #表示服务器端不会主动关闭链接

MaxKeepAliveRequests 100

KeepAliveTimeout 180因此这样的配置就会导致每个链接至少要过180S才会被释放,这样在大量请求访问时就必然会造成链接被占满,请求等待的情况。在通过DEBUH后发现HttpClient在method.releaseConnection()后并没有把链接关闭,这个方法只是将链接返回给connection manager。如果使用HttpClient client = new HttpClient()实例化一个HttpClient connection manager默认实现是使用SimpleHttpConnectionManager。SimpleHttpConnectionManager有个构造函数如下

Java代码/**

* The connection manager created with this constructor will try to keep the

* connection open (alive) between consecutive requests if the alwaysClose

* parameter is set to false. Otherwise the connection manager will

* always close connections upon release.

*

* @param alwaysClose if set true, the connection manager will always

*    close connections upon release.

*/

public SimpleHttpConnectionManager(boolean alwaysClose) {

super();

this.alwaysClose = alwaysClose;

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

Java代码this.httpConnectionManager = new SimpleHttpConnectionManager();因此alwaysClose默认是false,connection是不会被主动关闭的,因此我们就有了一个客户端关闭链接的方法。方法一:把事例代码中的第一行实例化代码改为如下即可,在method.releaseConnection();之后connection manager会关闭connection 。

Java代码HttpClient client = new HttpClient(new HttpClientParams(),new SimpleHttpConnectionManager(true) );方法二:实例化代码使用:HttpClient client = new HttpClient();在method.releaseConnection();之后加上

Java代码((SimpleHttpConnectionManager)client.getHttpConnectionManager()).shutdown();shutdown源代码很简单,看了一目了然

Java代码public void shutdown() {

httpConnection.close();

}方法三:实例化代码使用:HttpClient client = new HttpClient();在method.releaseConnection();之后加上client.getHttpConnectionManager().closeIdleConnections(0);此方法源码代码如下:

Java代码public void closeIdleConnections(long idleTimeout) {

long maxIdleTime = System.currentTimeMillis() - idleTimeout;

if (idleStartTime <= maxIdleTime) {

httpConnection.close();

}

}将idleTimeout设为0可以确保链接被关闭。以上这三种方法都是有客户端主动关闭TCP链接的方法。下面再介绍由服务器端自动关闭链接的方法。方法四:代码实现很简单,所有代码就和最上面的事例代码一样。只需要在HttpMethod method = new GetMethod("http://www.apache.org");加上一行HTTP头的设置即可

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

作者:创2002
来源链接:https://blog.csdn.net/weixin_34079825/article/details/114136155

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/server/112823.html

标签:HttpClient
分享给朋友:

“java httpclient 关闭” 的相关文章

go系列之利用Gin框架获取form参数 2022年05月15日 02:49:59
[C#][控件]常用控件命名规范 2022年05月17日 20:45:24
MySQL安装之yum安装 2022年05月19日 19:54:29
linux yum命令详解 2022年05月19日 19:54:29
常用日志框架介绍 2022年05月19日 20:04:06
引用类型 2022年05月21日 11:41:30
关于设计模式 2022年05月23日 23:02:13