HttpClient api-连接池

【README】

本文 refer2 HttpClient Tutorialicon-default.png?t=L9C2https://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() 方法来关闭在给定时间段内所有空闲连接。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用SpringBoot搭建一个简单的webSocket服务

前言 个人地址:使用SpringBoot搭建一个简单的webSocket服务 什么是WebSocket? WebSocket是一个HTML5新增的协议,它的目的在浏览器和服务器之间建立一个不受限的双向实时通信的通道。比如,服务器可以任意时刻发送消息给浏览器。它是基于TCP&am…

cas 登录之后不跳转_图解JWT如何用于单点登录

点击上方“Java知音”,选择“置顶公众号”技术文章第一时间送达!作者:流云诸葛http://cnblogs.com/lyzg/p/6132801.html推荐阅读(点击即可跳转阅读)1. 淘宝服务端高并发分布式架构演进之路2. IntelliJ IDEA 从入门到上瘾教程,2019…

转:java网络编程-HTTP编程

转自: java网络编程-HTTP编程_Stillsings的博客-CSDN博客HTTP编程Java HTTP编程支持模拟成浏览器的方式去访问网页URL, Uniform Resource Locator,代表一个资源URLConnection获取资源连接器根据URL的openConnection()方法获得URL…

Centos7-通过RPM方式安装MySQL5.7

前言 Hallo,我们都知道开发时数据库是不可或缺的,本文就简单记录一下安装MySQL数据库的其中一种方式吧。 系统环境 系统:CentOS Linux 7.5 数据库版本:5.7 安装步骤 1. 从官网获取安装包 官方下载地址:https://ww…

python开发工具下所有软件都打不开_Python 开发工具链全解

可能刚开始学习Python时,有人跟你说可以将源文件所在的文件夹添加到 PYTHONPATH环境变量中,然后可以从其他位置导入此代码。在大多数情况下,这个人常常忘记补充这是一个非常糟糕的主意。有些人在互联网上发现了这一点,其他人却要看…

利用F#库canopy进行UI测试

虽然Selenium是一个流行的UI测试库,但基于它创建的测试却有着脆弱与不可靠等常见的问题。InfoQ与canopy的作者Chris Holt进行了一次访谈,以便更深入地了解canopy这个在Selenium的基础上所创建的F#库。 InfoQ:你能否为我们介绍一下canopy&…

转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)

转自: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 我之前的HTTP开发是…

SpringBoot整合Shiro权限框架

前言 在系统管理中,权限是非常重要的一个环节。目前权限框架中使用比较多的有Shiro、Spring Security。🎃 本篇简单写一下SpringBoot整合Shiro权限框架小栗子🌰。 个人博客地址:SpringBoot整合Shiro权限框架 介绍Shiro Apache S…

Java开发必须掌握的8种网站攻防技术

转载自 Java开发必须掌握的8种网站攻防技术 XSS攻击 XSS攻击的全称是跨站脚本攻击(Cross Site Scripting),是WEB应用程序中最常见到的攻击手段之一。跨站脚本攻击指的是攻击者在网页中嵌入恶意脚本程序, 当用户打开该网页时,脚本程序便开始在客户端的浏览器上执行,以盗取客户端…

转:json与map互转

转自: java中字符串,json,Map互相转换(各种转换都有)_蜗牛驿站-CSDN博客_java json转map前提:使用jar包为fastjsonimport com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject; 程序如下: …

专属微信二维码python制作_如何利用Python制作简单的公众号二维码关注图

创意配图:微信,微信公众号,微信大V 而且最近发现了一个新的图像处理方面的库—Wand,它是 ImageMagick 库的 Python 接口。于是,我就打算用这个库来实现简单的制作一个二维码关注图,主要是完成以下几个工作&…

如何迁移#SNMP到.NET Core平台的一些体会

.NET Core 依然在飞速进化中,所以如果不是非常喜欢折腾的性格,建议各位还是暂时忍耐。 准备阶段 首先,Visual Studio 2015是必要的开发工具。虽然它已经包含了.NET Core的原始测试版,这里还是推荐下载 RC1 安装包, htt…

JAVA实现一个图片上传预览功能

这个小项目主要使用java实现了一个简单的图片上传预览功能,废话不多说,先上实现成果 ^ _ ^💯 预览 登录页 主页 上传页 图片预览 项目架构 后端: SpringBoot shiro mybatis-plus druid hutool 前端: layui viewer 项目结构 ├─src├…

小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难

PLC实质上是工业计算机,是计算机技术与传统继电接触器控制器技术相结合的产物,只不过比一般的计算机具有更强的与工业过程相连接的接口和更直接的适用于工业控制要求的编程语言。一、PLC的结构从硬件结构上看,PLC主要由中央处理单元(CPU)、存…

内部局域网可自行分配的ip地址

【1】有些ip地址很特殊 以 10. 、 172.16. 、172.31. 、192.168. 开头的所有ipv4地址都未分配。 更确切的说,这些地址不会被 ISP(Internet服务提供商)分配给广域网上的计算机,即无法加入全球Internet网络-广域网; 但…

以吃货的角度理解 IaaS,PaaS,SaaS 是什么

转载自 以吃货的角度理解 IaaS,PaaS,SaaS 是什么随着云计算时代的到来,越来越多的软件,开始采用云服务。越来越多的概念也随之而来。云服务只是一个统称,可以分成三大类。IaaS:基础设施服务,Inf…

.Net使用RabbitMQ详解

序言 这几天呢,公司风波再起,去年一年公司CTO换啦4任,CEO换啦三个,这不刚来个新老大,感觉还不错,却没干过3个月又要走,索性趁老大们走来走去的时候,就给自己空出来,稍稍总…

SpringBoot整合Redis要注意的那些

前言 昨天自己在重新学习SpringBoot整合Redis时,遇到了一个问题java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig,错误很明显找不到需要的类。下面主要记录一下错误是怎么出线的,并且如何解决。 错…

Java之Socket与HTTP区别

转自: Java之Socket与HTTP区别 - 曹刚 - 博客园我们都知道TCP/IP协议共分四层:①链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他…

人人都能掌握的Java服务端性能优化方案

转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验。如果我们的代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响应。这就可能导致用户投诉甚至用户的流失。 关于性…