- 浏览: 211822 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hus20120405:
很不错,我运行起来了
log4jdbc日志框架介绍 -
Roshomon:
牛叉 找了很多解决方案 你的OK了
plsql ora-12154 TNS 无法处理服务名 -
ackley:
赞!谢谢!
Cannot access NLS data files or invalid ...
HttpClient 某些方法的作用梳理。本文的测试基于httpcore-4.3.3.jar,httpclient-4.3.6.jar.
创建一个httpClient, 使用默认连接池。当多个线程使用同一个httpClient, 如果不调用httpClient.close(); 则多个线程共享两个连接。通过后台发现,始终有一个连接处于established状态。官网文章中说(默认,每个路由基础上的连接不超过2个,总连接数不能超过20)
关闭客户端,这时候如果有链接处于established状态,则装为TIME_WAIT状态。
httpClient创建的时候指定连接池,总连接数为200,每个域连接数最大为20。用多线程跑一下,发现一个站点最大连接数正好为20。
调用httpPost.abort(); 之后,连接被关闭,处于TIME_WAIT状态。这样做两个好处,一是当判断到状态码不为200的时候,不继续读取response内容,提升性能。二是这个连接可能有问题,关闭节省资源。多线程调用,故意使一个请求返回之后调用httpPost.abort()效果如下:
虽然httpClient是线程安全的,但是官网仍建议每个线程创建使用自己的上下文。
官网示例代码是写response.close(); 但是好像写不写效果一样的,待翻源码。
连接池需要自行清除过期和失效连接。
将tomcat服务器连接超时时间改为5秒后,过了5秒,客户端的连接都变成CLOSE_WAIT状态。
这时调用httpClient.close();方法就能正常关闭端口连接。测试还发现设置keepAliveTimeOut没有发生作用。
tomcat服务器设置这个之后,长连接失效,httpClient.execute(httppost)调用完即处于close_wait状态,等待EntityUtils.toString(entity, "UTF-8");之后,连接即可关闭。
当开启长连接,并设置connectionTimeout为5秒,connMgr.closeIdleConnections(30, TimeUnit.SECONDS);程序清除30秒内不活动连接。这时访问,发现5秒后后连接状态由established改为close_wait, 再过30秒后连接被清除。
设置客户端自定义的超时策略对链接超时并没有影响,还是以tomcat服务端的connectionTimeOut时长为准。以上代码虽然设置了客户端5秒超时,但实际是到30s之后才把链接状态由ESTABLISHED改为CLOSE_WAIT。 这30s正是服务端的connectionTimeOut时间。
问题一:
最近线上httpClient调用老是报 xxx.xxx.xxx.xxx:xxxx failed to respond
网上说有两种情况:
1)被调用的服务器过载,导致没有挥手即断开连接,客户端下一次请求时重用了这个已经失效的连接,就会报这个错误。
2)并发太高,服务器在挥手的过程中,客户端重用了连接,给的解决方案是发现这个错误,重新建一个连接(不从连接池取),这样保证连接是正常的,重新调用一次,调用完关闭。
我查看了业务服务,发现压力并不是很大。因此判断是不是服务器主动发起了关闭连接,而客户端仍然将这个连接保持在连接池中。因为客户端连接池的策略是每5s检测并关闭30s内不活跃的连接。tomcat服务器keepAliveTimeout默认是15s. 也就是说当连接空闲的15s-30s之间业务重用了这个连接,就会发生这个错误。
因此,修改tomcat的这个参数之后,一切正常。
CloseableHttpClient httpClient =HttpClients.createDefault();
创建一个httpClient, 使用默认连接池。当多个线程使用同一个httpClient, 如果不调用httpClient.close(); 则多个线程共享两个连接。通过后台发现,始终有一个连接处于established状态。官网文章中说(默认,每个路由基础上的连接不超过2个,总连接数不能超过20)
httpClient.close();
关闭客户端,这时候如果有链接处于established状态,则装为TIME_WAIT状态。
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); // 将最大连接数增加到200 cm.setMaxTotal(maxTotal); // 将每个路由基础的连接增加到20 cm.setDefaultMaxPerRoute(defaultMaxPerRoute); // 设置超时时间 RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();//设置请求和传输超时时间 // 创建默认的httpClient实例. CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(requestConfig).build();
httpClient创建的时候指定连接池,总连接数为200,每个域连接数最大为20。用多线程跑一下,发现一个站点最大连接数正好为20。
if (response.getStatusLine().getStatusCode()!= HttpStatus.SC_OK) { httpPost.abort(); return null; }
调用httpPost.abort(); 之后,连接被关闭,处于TIME_WAIT状态。这样做两个好处,一是当判断到状态码不为200的时候,不继续读取response内容,提升性能。二是这个连接可能有问题,关闭节省资源。多线程调用,故意使一个请求返回之后调用httpPost.abort()效果如下:
HttpContext context = HttpClientContext.create(); CloseableHttpResponse response = httpClient.execute(httpPost, context);
虽然httpClient是线程安全的,但是官网仍建议每个线程创建使用自己的上下文。
response.close(); httpPost.releaseConnection();
官网示例代码是写response.close(); 但是好像写不写效果一样的,待翻源码。
// 关闭失效的连接 connMgr.closeExpiredConnections(); // 可选的, 关闭30秒内不活动的连接 connMgr.closeIdleConnections(30, TimeUnit.SECONDS);
连接池需要自行清除过期和失效连接。
connectionTimeout="5000"
将tomcat服务器连接超时时间改为5秒后,过了5秒,客户端的连接都变成CLOSE_WAIT状态。
这时调用httpClient.close();方法就能正常关闭端口连接。测试还发现设置keepAliveTimeOut没有发生作用。
maxKeepAliveRequests="1"
tomcat服务器设置这个之后,长连接失效,httpClient.execute(httppost)调用完即处于close_wait状态,等待EntityUtils.toString(entity, "UTF-8");之后,连接即可关闭。
当开启长连接,并设置connectionTimeout为5秒,connMgr.closeIdleConnections(30, TimeUnit.SECONDS);程序清除30秒内不活动连接。这时访问,发现5秒后后连接状态由established改为close_wait, 再过30秒后连接被清除。
ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() { public long getKeepAliveDuration(HttpResponse response, HttpContext context) { // Honor 'keep-alive' header HeaderElementIterator it = new BasicHeaderElementIterator( response.headerIterator(HTTP.CONN_KEEP_ALIVE)); while (it.hasNext()) { HeaderElement he = it.nextElement(); String param = he.getName(); String value = he.getValue(); if (value != null && param.equalsIgnoreCase("timeout")) { try { return Long.parseLong(value) * 1000; } catch(NumberFormatException ignore) { } } } // Keep alive for 5 seconds only return 5 * 1000; } }; PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); // 将最大连接数增加到200 cm.setMaxTotal(100); // 将每个路由基础的连接增加到20 cm.setDefaultMaxPerRoute(5); // 创建默认的httpClient实例. CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).setKeepAliveStrategy(myStrategy).build();
设置客户端自定义的超时策略对链接超时并没有影响,还是以tomcat服务端的connectionTimeOut时长为准。以上代码虽然设置了客户端5秒超时,但实际是到30s之后才把链接状态由ESTABLISHED改为CLOSE_WAIT。 这30s正是服务端的connectionTimeOut时间。
问题一:
最近线上httpClient调用老是报 xxx.xxx.xxx.xxx:xxxx failed to respond
网上说有两种情况:
1)被调用的服务器过载,导致没有挥手即断开连接,客户端下一次请求时重用了这个已经失效的连接,就会报这个错误。
2)并发太高,服务器在挥手的过程中,客户端重用了连接,给的解决方案是发现这个错误,重新建一个连接(不从连接池取),这样保证连接是正常的,重新调用一次,调用完关闭。
我查看了业务服务,发现压力并不是很大。因此判断是不是服务器主动发起了关闭连接,而客户端仍然将这个连接保持在连接池中。因为客户端连接池的策略是每5s检测并关闭30s内不活跃的连接。tomcat服务器keepAliveTimeout默认是15s. 也就是说当连接空闲的15s-30s之间业务重用了这个连接,就会发生这个错误。
因此,修改tomcat的这个参数之后,一切正常。
发表评论
文章已被作者锁定,不允许评论。
-
zookeeper docker 集群安装
2022-10-14 17:18 1331. 下载镜像 docker pull docker.io/z ... -
Kafka学习笔记【三】-JAVA调用示例
2018-05-29 08:35 5691. pom.xml <dependency> ... -
Kafka学习笔记【二】-安装
2018-05-24 08:20 354kafka的安装如下: 一、准备环境 1) 三台服务器 ... -
Kafka学习笔记【一】-原理
2018-05-18 09:23 249一、kafka的重要概念 1. kafka 分为 Produ ... -
rabbitMQ学习笔记【三】-haproxy部署 原创
2018-04-11 16:11 374一、下载 https://fossies.org/lin ... -
rabbitMQ学习笔记【二】-集群部署 原创
2018-04-03 19:40 397一、准备工作 三台机器hosts: 192.168.3 ... -
rabbitMQ学习笔记【一】-单机部署 原创
2018-03-19 16:04 405公司对外接入需要支持MQ,最终选定rabbitMQ.本文 ... -
关于dubbo的思考【原创】
2016-09-21 08:23 1317最近在看dubbo的文档,有些内容结合自己的思考记录一下 1. ... -
dubbo http webservice 服务学习笔记【原创】
2016-09-11 19:12 6473学习了 dubbo rest服务之后,再使用dubbo htt ... -
dubbo rest 服务学习笔记(三)【原创】
2016-09-09 19:34 8743在配置过程中遇到两个 ... -
dubbo rest 服务学习笔记(二)【原创】
2016-09-09 19:21 1377采用dubbo客户端访问dubbo发布的rest服务,接上一篇 ... -
dubbo rest 服务学习笔记(一)【原创】
2016-09-09 19:07 6068dubbo是很好的服务治理工具,包含了注册,路由,监控 ... -
RocketMq数据处理
2016-06-27 08:58 609这篇讲实践中数据丢失、顺序幂等处理、性能压测,有时间再写 -
RocketMq学习笔记(2)【原创】
2016-06-27 08:55 1124前一篇文章http://zhenggm.i ... -
MS MQ 使用实践【原创】
2016-06-26 14:58 7661. 参照百度经验http://jingyan.baidu.c ... -
RocketMq学习笔记【原创】
2016-06-23 14:05 1577前段时间在实施分布式数据库的过程中,使用过rocketMQ, ... -
rest的调用 java 示例代码【原创】
2016-06-20 15:35 11171. 服务端示例代码(如何搭建rest服务,请看上一篇) ... -
jersey2 与 spring4 整合实践【原创】
2016-06-13 15:35 4970前几年用过jeysey,那都是1.x版本的,jersey2有很 ... -
java nio入门
2010-03-04 17:22 952首先了解下所谓的java nio是个什么东西! ... -
spring http invoker学习笔记
2010-01-04 16:58 3664概念 Spring HTTP invoker是spring框架 ...
相关推荐
HttpClient学习笔记 模拟测试浏览器表单提交
6. **连接管理**: HttpClient 内置了连接管理器,可以控制并发连接的数量,自动检测并关闭失效连接,适应多线程应用。 7. **持久连接**:支持HTTP/1.0的KeepAlive和HTTP/1.1的持久连接,提高效率。 8. **直接访问...
HttpClient 特别强调了在多线程环境中的连接管理和性能优化,能够处理代理、SSL/TLS 安全连接、认证以及文件上传等功能。 在使用 HttpClient 之前,可能需要进行一些预备工作。例如,如果你的 JRE 版本是 1.3.* ...
java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_...
### HttpClient学习精髓 #### 一、简介 HttpClient是Apache Jakarta Common下的一个子项目,它为开发者提供了高效、最新的以及功能丰富的支持HTTP协议的客户端编程工具包。HttpClient支持HTTP协议的最新版本及相关...
体中获取内容,如 `EntityUtils.toString()` 可以将实体转换为字符串,`EntityUtils.toByteArray()` 转换为字节数组。以下是一些关于 HttpClient ...通过持续学习和实践,可以深入理解和掌握这些知识点,提升开发效率。
HttpClient httpClient = new HttpClient(); GetMethod getMethod = new GetMethod("http://example.com"); int statusCode = httpClient.executeMethod(getMethod); if (statusCode == 200) { System.out....
总结,HttpClient 4.5 是一款强大且灵活的 HTTP 客户端库,其源码结构清晰,设计模式巧妙,通过深入学习和实践,开发者可以更好地利用它来实现高效、安全的网络通信。理解 HttpClient 4.5 的源码,不仅有助于我们...
在本文档中,首先对HttpClient进行了简介,提到了它属于Apache Jakarta Common项目下的子项目,强调了其功能丰富和高效的特点。接着,文档列出了HttpClient的基本功能和特性,包括实现了HTTP协议的多个版本,支持...
1、使用HttpClient发送GET请求: 2、使用HttpClient发送POST请求:和之前的GET类似 3、使用异步HttpClient发送请求,可以在github上找一些别人已经写好的代码,封装度比较高,直接拿来用。 4、多线程下载:使用...
### HttpClient 学习整理 #### 一、简介 `HttpClient`是Apache Jakarta Commons下的一个子项目,用于提供高效、最新及功能丰富的HTTP客户端编程工具包。对于那些希望通过HTTP协议访问网络资源的Java应用程序而言,...
HttpClient是Apache基金会开发的一个Java库,它为Java程序员提供了一个强大的、可信赖的HTTP协议客户端实现。...通过深入学习HttpClient,你可以更灵活地处理与Web服务器的交互,实现各种复杂的网络功能。
HttpClient 3.1需要依赖commons-httpclient-3.1.jar、commons-logging.jar和commons-codec.jar这些jar包,而HttpClient 4.x的最新版本为4.1.2,官方不再维护3.x版本。HttpClient 4.x的jar包可以在Apache官方网站上...
《深入解析httpclient.jar及其与code.jar的关联》 在Java开发中,HTTP通信是不可或缺的一部分,而Apache HttpClient库正是Java实现HTTP客户端操作的重要工具。本文将深入探讨httpclient.jar包,以及它与code.jar包...
HttpClient入门的学习资料将引领你深入理解这个库的使用方法和核心概念。以下是对HttpClient的详细介绍,以及如何开始使用它。 一、HttpClient简介 HttpClient是Apache基金会下的一个开源项目,它提供了一套强大的...
### HttpClient入门详解 #### 一、概述 `HttpClient` 是 Apache Jakarta Commons 下的一个子项目,提供了高效、功能丰富且遵循最新 HTTP 协议规范的客户端编程工具包。它支持 HTTP 协议的所有主流版本和特性,是...
3. **HttpClient的使用**:学习如何创建HttpClient实例,设置请求参数,发送GET和POST请求,以及处理响应。 4. **HtmlParser的运用**:掌握如何使用选择器选择元素,提取文本、属性值,以及遍历DOM树。了解错误处理...
综上所述,升级到HttpComponents HttpClient 4.x是一个复杂的过程,涉及到对新API的深入学习,理解新的编程模型和网络编程的优化。升级的好处包括性能的提升、更好的错误处理机制以及对最新HTTP协议特性的支持。通过...