【README】

本文 refer2 HttpClient Tutorialhttps://hc.apache.org/httpcomponents-client-4.5.x/current/tutorial/pdf/httpclient-tutorial.pdf


【2.3】http连接管理器

【2.3.1】可管理的连接与连接管理器

1)http连接简述

HTTP 连接是复杂的、有状态的、线程不安全的对象,需要正确管理以功能正常。

HTTP 连接一次只能被一个执行线程使用。

HttpClient 使用一个称为 http连接管理器 的实体来管理对 HTTP 连接的访问​,并由 HttpClientConnectionManager 接口表示。

HTTP 连接管理器的目的是作为新的 HTTP 连接工厂,管理持久连接的生命周期
并同步控制(synchronized-同步访问)对持久连接的访问​​,以确保一次只有一个线程访问一个连接。

2)http连接管理器

1.在内部,http连接管理器 HttpClientConnectionManager实现类 与ManagedHttpClientConnection的多个实例一起作为实际连接的代理,以管理连接状态,控制IO操作执行;

2.如果管理的连接被消费者释放或显式关闭,底层连接会脱离它的代理并返回给http管理器;即使服务消费者仍然持有对连接代理实例的引用,但它不能够有意或无意执行任何 I/O 操作或修改实际连接状态。

3)从连接管理器获取连接的示例代码

HttpClientContext context = HttpClientContext.create();
HttpClientConnectionManager connMrg = new BasicHttpClientConnectionManager();
HttpRoute route = new HttpRoute(new HttpHost("localhost", 80));
// Request new connection. This can be a long process
ConnectionRequest connRequest = connMrg.requestConnection(route, null);
// Wait for connection up to 10 sec
HttpClientConnection conn = connRequest.get(10, TimeUnit.SECONDS);
try {// If not openif (!conn.isOpen()) {// establish connection based on its route infoconnMrg.connect(conn, route, 1000, context);// and mark it as route completeconnMrg.routeComplete(conn, route, context);}// Do useful things with the connection.
} finally {connMrg.releaseConnection(conn, null, 1, TimeUnit.MINUTES);
}

如有必要,可以通过调用 ConnectionRequest#cancel() 提前终止连接请求。 这将解除阻塞在 ConnectionRequest#get() 方法中的线程。


【2.5】http连接清理策略

1)问题

经典阻塞 I/O 模型的主要缺点之一是网络套接字仅在IO操作阻塞时响应I/O 事件。

当一个连接被释放回管理器时,它可以保持活动状态,但无法监视套接字的状态并对任何 I/O 事件做出反应。

如果连接在服务器端关闭,则客户端连接无法检测到连接状态的变化(通过关闭终端套接字做出适当的反应)。

2)解决方法

HttpClient 尝试通过测试连接是否“过时”来解决该问题,但不是很有效,因为在使用连接执行http请求之前,服务器连接被关闭了。陈旧的连接检查不是 100% 可靠的。

要想让空闲连接的socket模型不占用线程资源,唯一可行方法是使用专用监控线程(如定时器线程)以清除因长期不活跃的过期连接;

监控线程可以定期调用 ClientConnectionManager#closeExpiredConnections()
关闭所有过期连接并连接池中清除。

还可以选择性调用 ClientConnectionManager#closeIdleConnections() 方法来关闭在给定时间段内所有空闲连接。


HttpClient api-连接池相关推荐

  1. 【线程池】自行准备linux环境,带你手写线程池,只需仅仅150行代码|内存池|API|连接池|应用协议丨C/C++Linux服务器开发

    [线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码 视频讲解如下,点击观看: [线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码|内存池|API|连接池|应用协 ...

  2. HttpClient的连接池||HttpClient的请求参数

    连接池 如果每次请求都要创建HttpClient,会有频繁创建和销毁的问题,可以使用连接池来解决这个问题 HttpClientPoolTest.java package cn.itcast.crawl ...

  3. python sqlserver api连接池_非常老的话题 SQLSERVER连接池

    非常老的话题 SQLSERVER连接池 写这篇文章不是说要炒冷饭,因为园子里有非常非常多关于SQLSERVER连接池的文章,但是他们说的都是引用MSDN里的解释 或者自己做一些测试试验一下连接池的性能 ...

  4. mysql api 连接池_SpringBoot-整合HikariCP连接池

    HikariCP连接池概述池化思想 池化思想是我们项目开发过程中的一种非常重要的思想,如整数池,字符串池,对象池.连接池.线程池等都是池化思想的一种应用,都是 通过复用对象,以减少因创建和释放对象所带 ...

  5. httpclient: 设置连接池及超时配置,请求数据:PoolingHttpClientConnectionManager

    public static void main(String[] args) throws Exception{//httpclient连接池//创建连接池PoolingHttpClientConne ...

  6. HttpClient以及连接池的使用

    1.HttpClient---不带参数的Get请求 package application;import org.apache.http.client.methods.CloseableHttpRes ...

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

    以下文章来源方志朋的博客,回复"666"获面试宝典 一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp so ...

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

    转载自  Http 持久连接与 HttpClient 连接池 一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp socket连 ...

  9. 问题备忘: httpclient连接池异常引发的惨案

    1. 问题描述 客户端A --> Ngnix --> 服务B Ngnix做服务B的负载,客户端访问服务B时,客户端偶尔会有抛出TimeoutException异常. 举个例子:如A在09: ...

  10. 连接池超时配置_HttpClient连接池的一些思考

    前言 使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理.事实上,通过分析httpclien ...

最新文章

  1. 【译】Analyzing Token Sale Models
  2. 洛谷p1115 最大子段和
  3. Debian7.2上一键安装Jetty
  4. 【cudnn】cudnn 安装
  5. 中求和符号上下标_涨电脑知识:如何在word中编写复杂的公式,写论文必备技能...
  6. Web前端期末大作业--响应式性感美女模特博客网页设计(HTML+CSS+JavaScript)实现
  7. Summarize to the Power of Two(CF-1005C)
  8. torch.cuda.FloatTensor 与 torch.FloatTensor(torch.Tensor)--CPU和GPU上的数据类型
  9. mysql 脚本安装工具_mysql 非安装版的一个自动安装脚本及工具(更新版)
  10. JAVA王思聪吃热狗程序_王思聪申请“吃热狗”专利,“吃热狗”已经要付费啦...
  11. (详细)华为荣耀3C H30-TL00的Usb调试模式在哪里开启的步骤
  12. Skeleton骨架总结
  13. AlertDialog点击确定必定会dismiss问题
  14. InfoPath 2007 添加 access 2007 数据库方法
  15. 【论文解析】Pixel-aligned Volumetric Avatars
  16. linux不能删除文件命令,无法删除文件的解决办法(rm命令的使用)
  17. 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)
  18. Visual Studio 2010各个版本比较
  19. 我的世界服务器地图名称修改,《我的世界》修改地图名称颜色教程
  20. 课程linux实验报告,Linux课程综合训练实验报告

热门文章

  1. 【NOI2020】命运【树形dp】【线段树合并】
  2. Codeforces Round #736 (Div. 2)E. The Three Little Pigs-长除法求多项式系数
  3. Matrix Equation
  4. The Bottom of a Graph Poj 2553
  5. CF1286D-LCC【动态dp,数学期望】
  6. I. Space Station(hash记忆化+dp)
  7. 纪中B组模拟赛总结(2020.2.13)
  8. 【ST表】栈(jzoj 2295)
  9. 2017西安交大ACM小学期数论 [水题]
  10. 汇编语言(四)之比较字符串