HttpClient多线程并发问题

这篇文章归纳了怎样在多线程环境下安全的使用HttpClient。缓存

创建链接
安全

        在HttpClient中使用多线程的一个主要缘由是能够一次执行多个方法。在执行期间,每个方法都使用一个HttpConnection实例。因为在同一时间多个链接只能安全地用于单一线程和方法和有限的资源,咱们就必须确保链接分配给正确的方法。而MultiThreadedHttpConnectionManager彻底能够代替咱们完成这一项工做,这样咱们就没必要去考虑多线程带来安全的问题。
MultiThreadedHttpConnectionManager connectionManager =
                 new MultiThreadedHttpConnectionManager();
          HttpClient client = new HttpClient(connectionManager);
服务器

以上代码中的HttpClient就在多线程中执行多个方法了。当咱们再次调用httpClient.executeMethod()方法时,就会去Connection Manager中去请求HttpConneciton的实例,这样就避免了线程安全问题,由于HttpClient已经帮咱们作了。网络


释放链接session

          Connection Management比较重要的是当链接再也不使用时,必定要手动释放。这样作的缘由是HttpClient不可以肯定哪一个方法不被使用,哪一个方法还在使用。这是由于Response body不是由HttpClient来自动读取其数据的,而是由使用HttpClient的应用程序来完成的。当读取Response的数据是时,必须使用此方法的链接。这样,在Response的数据在读取前,HttpClient是没有释放链接的。全部这就要求在读取完Response的数据后,应用程序及时的使用releaseConnection()方法来释放链接。特别注意,不管执行的方法或是否也不例外被抛出。对于每个HttpClient.executeMethod方法必须有一个method.releaseConnection ( )来释放链接。多线程


重用HttpClient实例并发

          通常说来,建议一个通信组件,甚至说一个应用软件就始终维持一个HttpClient对象实例存在。可是若是你的应用很稀罕才用到它,并且还不容许这么一个实例一直存在,那么,这里强烈建议,必定要显式地shut down 它的MultiThreadedHttpConnectionManager 。这样作是确保链接池里的Connection获得释放。 
异步


HttpMethod并发执行socket

         若是应用程序逻辑容许并发执行多个HTTP请求,(例如对多个服务器的多个并发请求,或对同一个服务器表明不一样用户身份的多个请求) ,应用程序能够为每个HTTP session开启一个专门的线程,这样的设计天然将带来显著的性能提高。 而当使用一个线程安全的链接管理器MultiThreadedHttpConnectionManager 时,HttpClient能保证线程安全。这样,多个线程能够共享这么一个线程安全的HttpClient实例。请注意,应用程序的每一个各自执行的线程必须使用各自的HttpMethod实例;而且可配置各自的HttpState实例和/或HostConfiguration实例(表明一个特定的会话状态和主机配置)。这个共享的HttpClient和其标配的MultiThreadedHttpConnectionManager将为各线程带来最高的性能。
高并发


使用流来发送和接收数据

        HttpClient同时支持Stream和String/byte[]两种方式来发送和接受数据,可是因为String/byte[]的方式会形成内存中有一份数据的拷贝或缓存,那么当请求或应答报文比较大,或者在高并发的应用中,使用String/byte[]就会形成额外的内存开销,因此使用流的方式来传输数据是更好的选择。


HttpClient的三种超时说明

/* 从链接池中取链接的超时时间 */ConnManagerParams.setTimeout(params, 1000);/* 链接超时 */HttpConnectionParams.setConnectionTimeout(params, 2000);/* 请求超时 */HttpConnectionParams.setSoTimeout(params, 4000); 第一行设置ConnectionPoolTimeout:这定义了从ConnectionManager管理的链接池中取出链接的超时时间,此处设置为1秒。第二行设置ConnectionTimeout:  这定义了经过网络与服务器创建链接的超时时间。Httpclient包中经过一个异步线程去建立与服务器的socket链接,这就是该socket链接的超时时间,此处设置为2秒。第三行设置SocketTimeout:    这定义了Socket读数据的超时时间,即从服务器获取响应数据须要等待的时间,此处设置为4秒。以上3种超时分别会抛出ConnectionPoolTimeoutException,ConnectionTimeoutException与SocketTimeoutException。

相关文章
相关标签/搜索