连接操作器

  1. 连接操作是客户端的底层套接字或可以通过外部实体,通常称为连接操作的被操作的状态的连接。
  2. OperatedClientConnection接口扩展了HttpClientConnection接口而且定义了额外的控制连接套接字的方法。
  3. ClientConnectionOperator接口代表了创建实例和更新那些对象底层套接字的策略。实现类最有可能利用SocketFactory来创建java.net.Socket实例。
  4. ClientConnectionOperator接口可以让HttpClient的用户提供一乐连接操作的定制策略和提供可选实现OperatedClientConnection接口的能力。

管理连接和连接管理器

  1. HTTP连接是复杂的,有状态,线程不安全的对象需要正确的管理以便正确的执行功能。http连接在同一时间仅仅只能由一个执行线程来使用。
  2. Httpclient使用一个叫做http连接管理器的特殊实体类来管理http连接,这个实体类要实现HttpClientConnectionManager接口。
  3. Http连接管理器作用:
  4. Http连接管理器在新建http连接时,作为工厂类;
  5. 管理持久http连接的生命周期;
  6. 同步持久连接(确保线程安全,即一个http连接同一个时间只能被一个线程访问);
  7. http连接管理器和ManagedHttpClientConnection的实例类一起工作,为一个真实连接去充当一个代理服务,以管理连接状态和控制执行I/O操作。
  8. ManagedHttpClientConnection实体类可以看做http连接的一个代理服务器,管理IO操作。
  9. 如果一个http连接被释放或者被它的消费者明确的表示要关闭,那么底层的连接就会和它的代理进行分离,并且该连接会被交还给连接管理器。
  10. 即使服务消费者仍然持有代理的引用,但它不能再执行IO操作,或者更改http连接的状态。
  11. HttpClientContext context = HttpClientContext.create();
  12. HttpClientConnectionManager connMrg = new BasicHttpClientConnectionManager();
  13. HttpRoute route = new HttpRoute(new HttpHost("localhost",80));
  14. //获取新的连接,这里可能耗费很多时间
  15. ConnectionRequest connRequest = connMrg.requestConnection(route,null);
  16. //10秒超时
  17. HttpClientConnection conn = connRequest.get(10,TimeUnit.SECONDS);
  18. try{
  19.  //如果创建失败
  20.  if(!conn.isOpen()){
  21.   //establish connection based on its route info
  22.    connMrg.connect(conn,route,1000,context);
  23. }else{
  24.    //and mark it as route complete
  25.    connMrg.routeComplete(conn,route,context);
  26. }
  27. }finally{
  28.  connMrg.releaseConnection(conn,null,1,TimeUnit.MINUTES);
  29. }
  30. 如果要终止连接,可以调用ConnectionRequestcancel()方法。这个方法会解锁被ConnectionRequestget()方法阻塞的线程。

简单连接管理器

  1. BasicHttpClientConnectionManager是一个简单的连接管理器,它一次只能管理一个连接。尽管这个类是线程安全的,它在同一个时间也只能被一个线程使用。
  2. BasicHttpClientConnectionManager会尽量重用旧的连接来发送后续的请求,并且使用相同的路由。如果后续请求的路由和旧连接中的路由不匹配,BasichttpClientConnectionManager就会关闭当前连接,使用请求中的路由重新建立连接。如果当前的连接正在被占用,会抛出java.lang.IllegalStateException异常。
  3. ClientConnectionRequest connRequest = connMrg.requestConnection(
  4. new HttpRoute(new HttpHost("localhost", 80)), null);
  5. ManagedClientConnection conn = connRequest.getConnection(10, TimeUnit.SECONDS);
  6. try {
  7.   BasicHttpRequest request = new BasicHttpRequest("GET", "/");
  8.   conn.sendRequestHeader(request);
  9.   HttpResponse response = conn.receiveResponseHeader();
  10.   conn.receiveResponseEntity(response);
  11.   HttpEntity entity = response.getEntity();
  12.   if (entity != null) {
  13.      BasicManagedEntity managedEntity = new BasicManagedEntity(entity, conn, true);
  14.      // 替换实体
  15.      response.setEntity(managedEntity);
  16.   }
  17.   // 使用响应对象做有用的事情。当响应内容被消耗后这个连接将会自动释放。
  18.   connMrg.releaseConnection(conn,null,1,TimeUnit.MINUTES);
  19. } catch (IOException ex) {
  20.   //在I/O error之上终止连接。
  21.  conn.cancel();
  22.  throw ex;
  23. }

连接池管理器

  1. 相对BasicHttpClientConnectionManager来说,PoolingHttpClientConnectionManager是一个复杂的类,它管理着客户端连接池,可以同时为很多线程提供Http连接请求。
  2. 当请求一个新的连接时,如果连接池有可用的持久连接,连接管理器就会使用其中的一个,而不是在创建一个新的连接。PoolingHttpClientConnectionManager维护的连接数在每个路由基础和总数上都有限制,默认每个路由基础上的连接不超过2个,总连接数不能超过20.
  3. 在实际应用中,这个限制可能会太小了,尤其是当服务器也使用http协议时。
  4. PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
  5. cm.setMaxTotal(200);
  6. cm.setDefaultMaxPerRoute(20);
  7. HttpHost localhost = new HttpHost("localhost",80);
  8. cm.setMaxPerRoute(new HttpRoute(localhost),50);
  9. CloseableHttpClient httpClient = HttpClients.custom()
  10.                                           .setConnectionManager(cm)
  11.                                           .build();

连接管理器关闭

  1. 当一个HttpClient实例不在需要并且即将离开其作用范围的时候,要关闭它的连接管理器以确保所有连接在管理器被关闭后保持活跃,并且这些连接的系统资源会被释放掉。
  2. CloseableHttpClient httpClient=<....>
  3. httpClient.close();
  4. DefaultHttpClient httpclient = new DefaultHttpClient();
  5. HttpGet httpget = new HttpGet("http://www.google.com/");
  6. HttpResponse response = httpclient.execute(httpget);
  7. HttpEntity entity = response.getEntity();
  8. System.out.println(response.getStatusLine());
  9. if (entity != null) {
  10.   entity.consumeContent();
  11. }
  12. httpclient.getConnectionManager().shutdown();

连接管理参数

  1. http.conn-manager.timeout
  2. 定义了当从ClientConnectionManager中检索ManagedClientConnection实例时使用的毫秒级超时时间。
  3. 如果这个参数没有设置就不会超时(默认无限大超时)
  4. http.conn-manager.max-per-route
  5. 定义了每个路由连接的最大数量。这个限制由客户端连接管理器来解释,而且应用与独立的管理器实例,为ConnPerRoute类型的值
  6. http.conn-manager.max-total
  7. 定义了总共连接的最大数目。这个限制由客户端连接管理器来解释,而且应用于独立的管理器实例。Integer类型的值。

httpclient 连接管理器的更多相关文章

  1. 在SSIS 的 64 位版本中不支持 Excel 连接管理器

    Microsoft sql server 2008 R2——> SQL SERVER Business Intelligence Development Studio 使用EXCEL数据源或目标 ...

  2. SOFA 源码分析 — 连接管理器

    前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的. 那么,如何实现这样一个 RPC 框架的网络 ...

  3. SSIS包的组建之连接管理器

    上一篇我们通过一个示例来介绍一下SSIS 包的开发.接下来的内容我们将学习一下包中各个选项卡的使用.如:连接管理器选项卡.控制流选项卡.数据流选项卡和事件处理选项卡等等.这一篇将介绍一下连接管理器作用 ...

  4. 在SSIS 的 64 位版本中不支持 Excel 连接管理器[转]

    Microsoft sql server 2008 R2——> SQL SERVER Business Intelligence Development Studio 使用EXCEL数据源或目标 ...

  5. openfire研究之部署连接管理器(connection manager)

    http://blog.sina.com.cn/s/blog_7325f5150101bafh.html 一. Openfire Connection Manager 简介 Openfire Conn ...

  6. HttpClient学习研究---第二章:连接管理

    第二章.Connection management连接管理2.1. 2.1.Connection persistence连接持久性The process of establishing a conne ...

  7. 转-HttpClient4.3 连接管理

    转 http://www.yeetrack.com/?p=782 2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大 ...

  8. HttpClient连接池的连接保持、超时和失效机制

    HTTP是一种无连接的事务协议,底层使用的还是TCP,连接池复用的就是TCP连接,目的就是在一个TCP连接上进行多次的HTTP请求从而提高性能.每次HTTP请求结束的时候,HttpClient会判断连 ...

  9. Http持久连接与HttpClient连接池

    一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp socket连接,当交互完毕后会关闭这个连接. HTTP协议是全双工的协议, ...

随机推荐

  1. trust zone之我见【转】

    本文转载自:https://blog.csdn.net/hovan/article/details/42520879 老板交待任务,这个星期我都在研究trust zone的东东,之前有看过代码,但没有 ...

  2. 【Git安装】centos安装git

    1 yum install git 安装后的默认存放地点/usr/bin/git

  3. 【第二十三章】 springboot + 全局异常处理

    一.单个controller范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotation ...

  4. 【TCP/IP详解 卷一:协议】第二十三章 TCP的保活定时器

    本章介绍保活定时器. 在 TCP 的三握四挥 章节中,我们介绍了 处在 TIME_WAIT 的 2MSL定时器:在 TCP的超时与重传 章节中,我们介绍了 重传定时器:在上一章节中,我们介绍了 防止死 ...

  5. 自整理的jquery.Validate验证表达式

    自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母    /^[0-9a-zA-Z]*$/g jQuery.validator.addMethod("letters ...

  6. SetCommMask

    SetCommMask           用途:设置串口通信事件   原型:BOOL SetCommMask(HANDLE hFile, //标识通信端口的句柄   DWORD dwEvtMask ...

  7. 《剑指offer》第三_一题(找出数组中重复的数字,可改变数组)

    // 面试题3(一):找出数组中重复的数字 // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请 ...

  8. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  9. 消息/事件, 同步/异步/协程, 并发/并行 协程与状态机 ——从python asyncio引发的集中学习

    我比较笨,只看用await asyncio.sleep(x)实现的例子,看再多,也还是不会. 已经在unity3d里用过coroutine了,也知道是“你执行一下,主动让出权限:我执行一下,主动让出权 ...

  10. 算法笔记--2-sat

    强连通分量的应用,详见<挑战程序设计>P324 例题1:HDU Peaceful Commission 思路:强连通分量分解,看有没有两个同一个国家的代表在一个强连通分量里,如果有,就是N ...