`
zhoujinhuang
  • 浏览: 93445 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

httpClient4.3.5超时设置

阅读更多

     这两天使用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。后续处理过程就用这个超时时间了。

 

  • 大小: 54.1 KB
分享到:
评论

相关推荐

    httpclient-4.3.5

    1. 连接管理:HttpClient支持多线程下的连接池管理,可以设置最大连接数、连接超时时间等,提高并发性能。 2. HTTPS支持:HttpClient可以配置SSLContext,支持HTTPS连接,同时可以处理自签名证书和特定的...

    httpcomponents-client-4.3.5.zip

    - **配置连接池**:合理设置连接池的大小和超时时间,避免资源浪费和连接耗尽。 - **处理异常**:针对可能出现的网络异常,如超时、重定向、认证失败等,需要编写相应的错误处理代码。 - **性能优化**:通过启用...

    httpclient需要的jar包

    在使用过程中,了解如何创建HttpClient实例,设置请求头,处理响应,以及如何正确关闭资源是非常重要的。 例如,一个简单的GET请求可能如下所示: ```java CloseableHttpClient httpClient = HttpClients.create...

    httpclient-4.3.1.jar,httpcore-4.3.2.jar,httpmime-4.3.5.jar

    在开发过程中,可能需要配置HttpClient以适应不同的网络环境,例如设置超时、启用或禁用SSL/TLS、处理代理服务器等。此外,连接管理策略也很重要,以避免过多的开放连接导致资源浪费或被服务器拒绝。 总的来说,...

    httpcore-4.3.2.jar和httpmime-4.3.5.jar

    2. **MimeBodyPart**: 代表MIME消息的一部分,可以设置内容类型、头部信息以及实际的body内容。 3. **MultipartEntityBuilder**: 提供构建MIME多部分实体的便利方法,可以轻松地添加多个BodyPart,并控制它们的顺序...

    httpasyncclient-4.0-beta4.jar、httpcore-4.3.2.jar和httpmime-4.3.5.jar

    在实际项目中,我们需要根据具体需求配置连接池大小、超时设置、重试策略等参数,以优化异步客户端的行为。同时,注意版本兼容性,确保选用的HttpAsyncClient版本与HttpCore和HttpMime版本相匹配。

Global site tag (gtag.js) - Google Analytics