httpClient中的timeout的配置
程序员文章站
2022-03-07 12:25:18
...
近日在用solrCloud的时候出现了一些状况,在进行查询的时候,由于某些节点的响应速度过慢导致整个请求响应的很慢,我们的解决办法是设置超时时间,也就是如果某些shard的响应太慢,则干脆忽略他的响应。这要涉及到配置httpClient的多个timeout,于是重新学习了一下HttpClient的三个配置,从源码中得到解释,然后做了个例子验证了源码的解释(我使用的httppClient的版本是4.5.2)。
httpClient的三个timeout分别是:connectionRequestTimeout、connectionTimeout、socketTimeout,先看源码中的解释吧:
1、connectionRequestTimeout
/** * Returns the timeout in milliseconds used when requesting a connection * from the connection manager. A timeout value of zero is interpreted * as an infinite timeout. * <p> * A timeout value of zero is interpreted as an infinite timeout. * A negative value is interpreted as undefined (system default). * </p> * <p> * Default: {@code -1} * </p> */ public int getConnectionRequestTimeout() { return connectionRequestTimeout; }
这个表示从connection manager中获得一个connection的超时时间,也就是从连接池中拿到一个connection的最大时间(连接池的原理我还没有研究),0表示没有任何的限制,如果是-1表示依赖于平台。
2、connectionTimeout
/** * Determines the timeout in milliseconds until a connection is established. * A timeout value of zero is interpreted as an infinite timeout. * <p> * A timeout value of zero is interpreted as an infinite timeout. * A negative value is interpreted as undefined (system default). * </p> * <p> * Default: {@code -1} * </p> */ public int getConnectTimeout() { return connectTimeout; }
这个表示建立连接的最大时间,这个有点不太懂,前面的connectionRequestTimeout不是已经说过获得connection了吗?为啥这里还说建立连接的时间?
3、socketTimeout
/** * Defines the socket timeout ({@code SO_TIMEOUT}) in milliseconds, * which is the timeout for waiting for data or, put differently, * a maximum period inactivity between two consecutive data packets). * <p> * A timeout value of zero is interpreted as an infinite timeout. * A negative value is interpreted as undefined (system default). * </p> * <p> * Default: {@code -1} * </p> */ public int getSocketTimeout() { return socketTimeout; }
等待一个数据包的最大时间,这个倒是很简单。