这两天使用httpclient4.3.5(好像httpclient每个版本差别挺大的)访问一个https的服务,发现跑一段时间后有连接在createLayeredSocket的时候卡住,并且一直不超时释放,线程调用栈:
"Thread-12" daemon prio=10 tid=0x00002aaab488a000 nid=0x4b02 runnable [0x0000000042712000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:830)
- locked <0x000000078309d398> (a java.lang.Object)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
- locked <0x000000078309d4a0> (a java.lang.Object)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:275)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:254)
at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:123)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363)
google了一圈,httpclient有个几个超时时间需要设置,少设置了PoolingHttpClientConnectionManager中DefaultSocketConfig的超时时间。
在使用连接池的情况下,访问https请求。httpClient超时的设置包括两个位置:
1 httppost.setConfig(requestConfig); 通过执行的http请求设置RequestConfig。
RequestConfig包括setConnectionRequestTimeout分配等待连接池分配的超时时间、setConnectTimeout建立网络连接的超时时间、setSocketTimeout 通讯过程中的超时时间。
2 PoolingHttpClientConnectionManager.setDefaultSocketConfig;连接管理器设置设置默认socket 超时时间,SocketConfig.Builder.setSoTimeout方法。
执行设置了RequestConfig的https请求时,处理过程如下:
与超时时间相关的位置:
A 从连接池获取连接,最长的等待时间,使用RequestConfig. getConnectionRequestTimeout。
B 创建socket对象,使用SocketConfig . getSoTimeout设置socket的soTimeout.
C socket建立网络连接,使用RequestConfig.getConnectTimeout作为发起连接的超时时间。
D createLayeredSocket完成SSL握手处理,使用socket的超时时间(就是B设置的SocketConfig . getSoTimeout)。
E 使用RequestConfig.getSocketTimeout设置分配的Socket的soTimeout。后续处理过程就用这个超时时间了。
相关推荐
《HttpClient 4.3.5:官方最新版的深度解析》 HttpClient,作为一个广泛使用的Java库,主要用于发起HTTP请求并处理响应,是开发人员在进行网络编程时的重要工具。HttpClient 4.3.5是其官方网站提供的最新版本,旨在...
Jakarta HttpComponents HTTPClient 。httpclient-4.3.5.jar
1. 连接管理:HttpClient支持多线程下的连接池管理,可以设置最大连接数、连接超时时间等,提高并发性能。 2. HTTPS支持:HttpClient可以配置SSLContext,支持HTTPS连接,同时可以处理自签名证书和特定的...
1. **请求构造与执行**:HttpClient允许开发者构建复杂的HTTP请求,如GET、POST、PUT、DELETE等,支持添加HTTP头信息、设置请求参数,以及自定义请求体。 2. **连接管理**:HttpClient提供了连接池管理机制,可以...
httpclient-4.3.5-sources.jar
Java HTTPClient 设置超时时间和代理的方法 Java HTTPClient 是一个功能强大且灵活的 HTTP 客户端库,提供了许多实用的功能来处理 HTTP 请求。其中,设置超时时间和代理是两个非常重要的配置项,本文将详细介绍如何...
本教程将详细讲解如何在.NET 6中利用HttpClient设置超时机制,确保你的请求处理在预设时间内完成,避免程序因长时间等待响应而卡死。 HttpClient类提供了发送HTTP请求的能力,同时允许开发者配置请求的多个方面,...
httpclient-4.3.5完美解决了 使用httpclient高版本时与Android系统包framework.jar有同类名冲突的问题。HttpClient可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。httpclient 实现需要...
- **配置连接池**:合理设置连接池的大小和超时时间,避免资源浪费和连接耗尽。 - **处理异常**:针对可能出现的网络异常,如超时、重定向、认证失败等,需要编写相应的错误处理代码。 - **性能优化**:通过启用...
这个"HttpClient for android 4.3.5 jar"包含了两个文件:`httpclient-android-4.3.5-sources.jar`和`httpclient-android-4.3.5.jar`。 `httpclient-android-4.3.5-sources.jar`是源码版本的jar文件,它包含了...
httpclient的jar包源码,前段时间jad不能使用,所以想起来可以搞源码,找了好久,放在这里分享给大家
在使用过程中,了解如何创建HttpClient实例,设置请求头,处理响应,以及如何正确关闭资源是非常重要的。 例如,一个简单的GET请求可能如下所示: ```java CloseableHttpClient httpClient = HttpClients.create...
3. **适当地配置超时**:根据实际需求设置超时时间,确保既不会因为过短的超时导致请求频繁失败,也不会因为过长的超时影响应用性能。 总之,理解并正确设置HttpClient的超时控制是优化网络请求性能的关键。通过...
### HttpClient4.5.1 手册知识点概览 #### 一、基础知识 **1.1 请求执行** - **HTTP请求:** 在客户端与服务器之间的交互过程中,客户端发送的每一条消息都称为一个请求。HTTP请求由三部分组成:请求行、请求头...
javase http通讯技术 apache httpclient4.3 设置代理详解
HttpClient 4.5.3 (GA) is a maintenance release that fixes a number of defects found since 4.5.2. Please note that as of 4.4 HttpClient requires Java 1.6 or newer. Changelog: ------------------- * ...
`Test.java`文件可能是包含示例代码的测试类,演示如何使用这个修改后的jar包设置超时。在实际使用中,你可以找到类似以下的代码片段来设置超时: ```java SoapHttpClient client = new SoapHttpClient(); // ...