HttpClient中的三个种超时
ConnectTimeout、SocketTimeout、ConnectionRequestTimeout其中前两种和Java socket timeout的概念类似。

1.ConnectTimeout

建立链接的最大时间,也就是完成三次握手,建立tcp链接所用的时间。

JAVA API

/**
* Connects this socket to the server with a specified timeout value.
* A timeout of zero is interpreted as an infinite timeout. The connection
* will then block until established or an error occurs.
*
* @param   endpoint the {@code SocketAddress}
* @param   timeout  the timeout value to be used in milliseconds.
* @throws  IOException if an error occurs during the connection
* @throws  SocketTimeoutException if timeout expires before connecting
* @throws  java.nio.channels.IllegalBlockingModeException
*          if this socket has an associated channel,
*          and the channel is in non-blocking mode
* @throws  IllegalArgumentException if endpoint is null or is a
*          SocketAddress subclass not supported by this socket
* @since 1.4
* @spec JSR-51
*/
public void connect(SocketAddress endpoint, int timeout) throws IOException 

 

将此套接字连接到服务器,并指定一个超时值。超时值零被解释为无限超时。在建立连接或者发生错误之前,连接一直处于阻塞状态。当不设置该参数时,指客户端请求和服务端建立tcp连接时,会一直阻塞直到连接建立成功,或抛异常。当设置了connectTimeout, 客户端请求和服务端建立连接时,阻塞时间超过connectTimeout时,就会抛出异常java.net.ConnectException: Connection timed out: connect。

Httpclient API

getConnectTimeout() 
Determines the timeout in milliseconds until a connection is established.

 

2.SocketTimeout

读取数据timeout,soTimeout。read()方法阻塞的最大时间,也是,两个packet的间隔时间。
 

JAVA API 

/**
*  Enable/disable {@link SocketOptions#SO_TIMEOUT SO_TIMEOUT}
*  with the specified timeout, in milliseconds. With this option set
*  to a non-zero timeout, a read() call on the InputStream associated with
*  this Socket will block for only this amount of time.  If the timeout
*  expires, a <B>java.net.SocketTimeoutException</B> is raised, though the
*  Socket is still valid. The option <B>must</B> be enabled
*  prior to entering the blocking operation to have effect. The
*  timeout must be {@code > 0}.
*  A timeout of zero is interpreted as an infinite timeout.
*
* @param timeout the specified timeout, in milliseconds.
* @exception SocketException if there is an error
* in the underlying protocol, such as a TCP error.
* @since   JDK 1.1
* @see #getSoTimeout()
*/
public synchronized void setSoTimeout(int timeout) throws SocketException 

public synchronized void setSoTimeout(int timeout) throws SocketException 
启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 Socket 仍旧有效。选项 必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。
这个参数通过socket.setSoTimeout(int timeout)方法设置,可以看出它的意思是,socket关联的InputStream的read()方法会阻塞,直到超过设置的so timeout,就会抛出SocketTimeoutException。当不设置这个参数时,默认值为无穷大,即InputStream的read方法会一直阻塞下去,除非连接断开。

Httpclient API

getSocketTimeout() 
Defines the socket timeout (SO_TIMEOUT) in milliseconds, which is the timeout for waiting for data or, put differently, a maximum period inactivity between two consecutive data packets).

3.ConnectionRequestTimeout

从连接池中获取可用连接超时
HttpClient中的要用连接时尝试从连接池中获取,若是在等待了一定的时间后还没有获取到可用连接(比如连接池中没有空闲连接了)则会抛出获取连接超时异常。

reference:
[1].https://blog.csdn.net/IndexMan/article/details/80025259
[2].https://blog.csdn.net/wangjun5159/article/details/78140648 
[3].https://blog.csdn.net/zhongzh86/article/details/46348933

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐