HttpClient中各种Timeout总结

2,328 阅读4分钟

引言

在网络请求中,HttpClient是一个常用的工具,用于发送HTTP请求并接收响应。为了提高请求的性能和稳定性,合理设置HttpClient的超时参数至关重要。本文将重点关注ConnectionRequestTimeout、ConnectTimeout和SocketTimeout这三个核心参数,并对其使用和配置进行详细的解释和讨论。

核心参数

下面是一个常见的httpclient中RequestConfig的配置,从配置中可以识别出三个核心参数,分别是:setConnectionRequestTimeout、setConnectTimeout、setSocketTimeout:

private static RequestConfig getDefaultRequestConfig(){
    RequestConfig requestConfig = RequestConfig
            .custom()
            /*
             * 从连接池中获取连接的超时时间,假设:连接池中已经使用的连接数等于setMaxTotal,新来的线程在等待1*1000
             * 后超时,错误内容:org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
             */
            .setConnectionRequestTimeout(1*1000)
            /*
             * 这定义了通过网络与服务器建立连接的超时时间。
             * Httpclient包中通过一个异步线程去创建与服务器的socket连接,这就是该socket连接的超时时间,
             * 此处设置为2秒。假设:访问一个IP,192.168.10.100,这个IP不存在或者响应太慢,那么将会返回
             * java.net.SocketTimeoutException: connect timed out
             */
            .setConnectTimeout(5*1000)
            /*
             * 指的是连接上一个url,获取response的返回等待时间,假设:url程序中存在阻塞、或者response
             * 返回的文件内容太大,在指定的时间内没有读完,则出现
             * java.net.SocketTimeoutException: Read timed out
             */
            .setSocketTimeout(30*1000)
            .build();
    return requestConfig;
}

1、ConnectionRequestTimeout

ConnectionRequestTimeout是指从连接池中获取连接的超时时间。当HttpClient请求发送时,如果在连接池中无法获取可用连接,并且等待时间超过了ConnectionRequestTimeout设置的值,将会抛出异常。这个参数的设置可以确保在获取连接时的等待时间不会过长,提高请求的效率。

2、ConnectTimeout

ConnectTimeout表示建立连接的超时时间。在HttpClient尝试与服务器建立连接的过程中,如果连接未在ConnectTimeout设定的时间内建立成功,将会抛出异常。通过合理设置ConnectTimeout,可以避免因网络延迟等原因导致的连接超时问题。

3、SocketTimeout

SocketTimeout是数据传输的超时时间。当HttpClient与服务器成功建立连接后,开始进行数据传输。如果在SocketTimeout设定的时间内数据传输未完成,将会抛出异常。通过调整SocketTimeout的值,可以在数据传输过程中避免因网络不稳定等原因导致的超时错误。

适用场景

1、ConnectionRequestTimeout

适用场景: 适用于高并发场景下,多个请求同时竞争连接池中的连接资源。通过合理设置ConnectionRequestTimeout,可以防止因连接资源不足而导致的请求等待时间过长,确保请求能够及时处理。

2、ConnectTimeout

适用场景: 适用于网络不稳定或者服务器响应较慢的场景。适当增加ConnectTimeout的值,可以给予HttpClient更多的时间来建立连接,减少因网络波动导致的连接失败情况。

3、SocketTimeout

适用场景: 适用于需要传输大量数据的请求场景。通过合理调整SocketTimeout的值,可以在数据传输过程中给予足够的时间,确保数据能够完整传输,避免因网络延迟或数据传输量大而导致的超时错误。

异常解决

1、ConnectionRequestTimeout

当ConnectionRequestTimeout超时,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool。解决方案包括:

  • 调整ConnectionRequestTimeout值,增大等待时间。
  • 增大连接池大小,提供更多可用连接。
  • 优化服务器处理性能,减少连接占用时间。

2、ConnectTimeout

当ConnectTimeout超时,同样会抛出java.net.SocketTimeoutException: connect timed out。解决方案包括:

  • 调整ConnectTimeout值,适当增大。
  • 检查网络环境,确保网络通畅。
  • 检查服务器状态,确保服务器正常运行并能够及时响应连接请求。

3、SocketTimeout

当SocketTimeout超时,会抛出java.net.SocketTimeoutException: Read timed out。解决方案包括:

  • 调整SocketTimeout值,适当增大等待时间。
  • 优化服务器处理逻辑,提高处理速度。
  • 检查网络状况,确保数据传输的稳定性。

总结

通过对HttpClient中ConnectionRequestTimeout、ConnectTimeout和SocketTimeout这三个核心参数的详细解释和讨论,我们可以更好地控制网络请求的超时行为,提高应用程序的稳定性和性能。在实际应用中,我们需要根据具体场景和需求来合理设置这些参数,并注意处理可能出现的异常情况,以确保网络请求的顺利进行。


参考:

blog.csdn.net/qq_38534363…

blog.csdn.net/qq_16504067…

blog.csdn.net/Mlong54/art…

blog.csdn.net/tianyeshiye…