`

httpclient连接池

阅读更多
httpclient妙用一 httpclient作为客户端调用webservice http://aperise.iteye.com/blog/2223454
httpclient妙用二 httpclient保持会话登录 http://aperise.iteye.com/blog/2223470
httpclient连接池 http://aperise.iteye.com/blog/2295153

httpclient连接池

1.连接池原理(待续)

2.httpclient连接池如何保证连接交回至连接池管理器

    2.1 方式一

  HttpResponse response = (httpMethod);
  HttpEntity entity = response.getEntity();
  //这两段代码返回的entity是HttpEntity的实现类BasicManagedEntity。此时与本次请求关联的连接尚未归还至连接管理器。需要调用以下两条语句:
  InputStream instream = entity.getContent();//获得响应具体内容
  //处理响应:代码省略
  instream.close();//关闭输入流同时会将连接交回至连接处理器

     2.2 方式二使用默认的响应处理器BasicResponseHandler

  httpClient Jar包中提供BasicResponseHandler。如果返回的类型能确定需要解码为String类型的话,推荐使用该响应处理器。
  该处理器解码http连接响应字节流为String类型,对返回码>=300的响应进行了异常封装,并能够保证连接交还给连接池管理器。
  该处理器将字节解码为字符的过程依次如下:
  1)如果响应http报文Head部分由指定的charset,则使用该charset进行解码,否则进行下一步。例如使用UTF-8解码以下响应:DEBUG org.apache.http.headers - $amp;
  2)如果响应报文未执行charset,则使用传入EntityUntils.toString()时指定的charset进行解码。否则进行下一步
  3)使用ISO-8859-1进行解码。

 

3.实现连接池(待续)

4.遇到的问题

    4.1 连接池阻塞,频繁的报以下错误信息

pooling post() method executing IOException:java.net.SocketTimeoutException: Read timed out
java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:136)
        at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:152)
        at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:270)
        at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
        at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
        at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
        at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:161)
        at sun.reflect.GeneratedMethodAccessor96.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.http.impl.conn.CPoolProxy.invoke(CPoolProxy.java:138)
        at com.sun.proxy.$Proxy43.receiveResponseHeader(Unknown Source)
        at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
        at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:254)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
        at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:85)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:214)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:160)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:136)

 上述问题主要问题是连接池中httpclient连接在遇到异常情况下未正常关闭导致,出问题时候连接池关于回收httpclient连接的代码如下:

	private ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
		public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException {
			int status = response.getStatusLine().getStatusCode();
			if (status >= HttpStatus.SC_OK && status < HttpStatus.SC_MULTIPLE_CHOICES) {
				HttpEntity entity = response.getEntity();
				
				Charset charset = ContentType.getOrDefault(entity).getCharset();
				if (charset == null) {
					charset = Charset.forName("UTF-8");
				}
				return entity != null ? EntityUtils.toString(entity, charset) : null;
			} else {
                             //注意这里没有告诉连接池要回收连接
				throw new ClientProtocolException("Unexpected response status: " + status);
			}
	};

 修改后的代码如下:

	private ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
		public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException {

	        final StatusLine statusLine = response.getStatusLine();
	        final HttpEntity entity = response.getEntity();
	        if (statusLine.getStatusCode() >= HttpStatus.SC_MULTIPLE_CHOICES||statusLine.getStatusCode()<HttpStatus.SC_OK) {
	            //主动回收httpclient连接
		    EntityUtils.consume(entity);
	            throw new HttpResponseException(statusLine.getStatusCode(),
	                    statusLine.getReasonPhrase());
	        }
	        Charset charset = ContentType.getOrDefault(entity).getCharset();
			if (charset == null) {
				charset = Charset.forName("UTF-8");
			}
			return entity != null ? EntityUtils.toString(entity, charset) : null;
		}
	};

 

分享到:
评论

相关推荐

    HttpAsyncClient 异步httpClient和同步httpClient连接池的工具类 包含jar

    HttpAsyncClient连接池的使用,项目中频繁发送http请求,同步http阻塞主线程,影响性能,使用 HttpAsyncClient可使性能提高,这里配合连接池使用,效果更好,同时还附带同步httpClient的连接池使用

    HttpCient连接池Demo

    HttpClient连接池是网络编程中一个重要的优化手段,它允许我们重用已经建立的HTTP连接,减少每次请求时的建立和关闭连接的开销,从而提高应用程序的性能和效率。Apache HttpClient库提供了这样的功能,让我们能够...

    HTTPClient工具类,完整

    HTTPClient工具类,完整,HTTPClient工具类,完整,HTTPClient工具类,完整HTTPClient工具类,完整,HTTPClient工具类,完整

    连接池实现原理及效率测试

    《连接池实现原理及效率测试》 连接池是数据库应用中的一个重要概念,它在系统设计中扮演着提高性能、优化资源利用的关键角色。本文将深入探讨连接池的实现原理,并通过实际测试分析其效率。 首先,我们需要理解...

    springboot中注解配置连接池

    在Spring Boot应用中,连接池是管理数据库连接的关键组件,它能提高数据库操作的效率和应用程序的性能。本文将深入探讨如何使用注解配置在Spring Boot中设置连接池。 首先,Spring Boot默认集成了多种数据库连接池...

    连接池研究1

    4. **HttpClient连接池管理** - HttpClient默认使用长连接,Tomcat中,默认的最大长连接时间为`connectionTimeout`。 - 如果手动调用`releaseConnection`,在`ManagedClientConnectionImpl`中会关闭socket,而如果...

    httpClient工具类

    封装好的httpClient工具类里面包含了get 和 post两种请求

    HttpConnectionManager.java

    Httpclient连接池

    使用java的HttpClient实现多线程并发

    静态初始化HttpClient和连接池管理器: ```java static { // 创建连接池管理器 cm = new PoolingHttpClientConnectionManager(); // 设置整个连接池的最大连接数 cm.setMaxTotal(200); // 设置每个路由上的默认...

    基于java开发的NIO+多线程实现聊天室+源码+项目解析(毕业设计&课程设计&项目开发)

    HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子变量 内置锁 CompletionService log4j+slf4j日志 实现的功能 登录注销 单聊 群聊 客户端提交任务,下载图片并显示 上线下线公告 在线用户记录 批量下载豆瓣...

    java多线程程序设计:Java NIO+多线程实现聊天室

    HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子变量 内置锁 CompletionService log4j+slf4j日志 实现的功能 登录注销 单聊 群聊 客户端提交任务,下载图片并显示 上线下线公告 在线用户记录 批量下载豆瓣...

    Http连接池工具类

    两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包...一般情况下,普通使用HttpClient已经能满足我们的需求,不过有时候,在我们需要高并发大量的请求网络的时候,还是用“连接池”这样的概念能提升吞吐量。

    Java NIO+多线程实现聊天室

    HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子指标 内置锁 竣工服务 log4j+slf4j日志 实现的功能 登录注销 单聊 群聊 客户端提交任务,下载图片并显示 上线下线公告 在线用户记录 批量下载豆瓣电影的...

    HttpClientUtil工具类发送get和post请求,支持http和https,支持发送文件

    HttpClientUtil可能需要配置连接池的大小、超时时间等参数,以适应不同的应用场景。 综上所述,HttpClientUtil工具类在IT应用中扮演着关键角色,简化了HTTP和HTTPS请求的实现,特别是发送文件这样的复杂操作。通过...

    httpclient.jar包下载

    1. **连接管理**:HttpClient通过HttpConnectionManager接口控制HTTP连接的创建、复用和关闭,有效地管理连接池,避免了频繁建立新连接带来的性能开销。 2. **请求和响应模型**:HttpClient使用HttpRequest和...

    httpclient3.1 javadoc chm版

    HttpClient 3.1支持连接池,可以复用已建立的连接,提高性能。使用HttpConnectionManager来管理连接池,如SingleClientConnManager或MultiThreadedHttpConnectionManager。 五、重定向处理 HttpClient可以自动处理...

    HttpClient4.2.1版本的Jar包

    HttpClient 4.2.1是该项目的一个稳定版本,它包含了对HTTP协议的全面支持,包括基本的GET、POST请求,以及更复杂的重定向处理、Cookie管理、连接池等功能。 HttpClient 4.2.1版本引入了一些重要的改进和修复,以...

    httpclient-4.5jar包

    HttpClient 4.5提供了PoolingHttpClientConnectionManager,用于管理连接池。开发者可以设定最大连接数、每个路由的最大连接数,以及超时时间。连接池的使用可以显著减少建立新连接的开销,提高性能。 五、异步操作...

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip

    - HttpClient连接池 - Spring依赖注入 - lombok简化POJO开发 - 原子变量 - 内置锁 - CompletionService - log4j+slf4j日志 - 实现的功能 - 登录注销 - 单聊 - 群聊 - 客户端提交任务,下载图片并显示 -...

Global site tag (gtag.js) - Google Analytics