Apache HTTPClient 随时超时
Apache HTTPClient Timeout at any moment
我正在使用 Apache Common 的 HTTPClient 建立 HTTP 连接。
连接类型为 POST,客户端将从连接读取输出。
但是,无论连接状态如何,我都需要能够随时中止连接。这样做的最佳方法是什么?
是否有内置超时?
问候。
编辑:
只是为了澄清我的问题:
我希望用户能够选择何时断开连接。
换句话说,类似于参数 cURL 的功能:
CURLOPT_TIMEOUT
https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html
当您使用 HttpClientBuilder, you can pass an instance of RequestConfig 向构建器实例化 httpClient 的实例时,构建器又接受 2 个参数。
SocketTimeout
- 以毫秒为单位定义套接字超时 (SO_TIMEOUT),这是等待数据的超时,或者换句话说,两个连续数据包之间的最大不活动时间。 =16=]
ConnectTimeout
- 确定建立连接前的超时时间(以毫秒为单位)。零超时值被解释为无限超时。
ConnectionRequestTimeout
- Returns 从连接管理器请求连接时使用的超时时间(以毫秒为单位)。零超时值被解释为无限超时。
您要找的是 SocketTimeout.
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECTION_TIMEOUT)
.setConnectionRequestTimeout(CONNECTION_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();
httpClient = HttpClientBuilder.create().disableAutomaticRetries().setDefaultRequestConfig(requestConfig)
.setConnectionManager(poolingHttpClientConnectionManager).disableRedirectHandling().build();
你可以看看ConnectionKeepAliveStrategy. Refer to "2.6. Connection keep alive strategy" section of page
如果您正在使用 DefaultHttpClient, it accepts HttpParams,您可以在其中提供连接相关设置。
SO_TIMEOUT 是 SocketTimeout - 以毫秒为单位定义套接字超时 (SO_TIMEOUT),这是等待数据的超时,或者换句话说,两个连续数据包之间的最大不活动时间).
HttpParams httpParams = new BasicHttpParams();
httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT);
httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT);
DefaultHttpClient backend = new DefaultHttpClient(httpParams);
更好的方法是按照@Bandi Kishore 的建议使用 HttpClientBuilder。或者使用 PoolingClientConnectionManager
直接使用 setter 接受这些设置。
我正在使用 Apache Common 的 HTTPClient 建立 HTTP 连接。 连接类型为 POST,客户端将从连接读取输出。 但是,无论连接状态如何,我都需要能够随时中止连接。这样做的最佳方法是什么? 是否有内置超时? 问候。
编辑:
只是为了澄清我的问题:
我希望用户能够选择何时断开连接。
换句话说,类似于参数 cURL 的功能:
CURLOPT_TIMEOUT
https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html
当您使用 HttpClientBuilder, you can pass an instance of RequestConfig 向构建器实例化 httpClient 的实例时,构建器又接受 2 个参数。
SocketTimeout
- 以毫秒为单位定义套接字超时 (SO_TIMEOUT),这是等待数据的超时,或者换句话说,两个连续数据包之间的最大不活动时间。 =16=]
ConnectTimeout
- 确定建立连接前的超时时间(以毫秒为单位)。零超时值被解释为无限超时。
ConnectionRequestTimeout
- Returns 从连接管理器请求连接时使用的超时时间(以毫秒为单位)。零超时值被解释为无限超时。
您要找的是 SocketTimeout.
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECTION_TIMEOUT)
.setConnectionRequestTimeout(CONNECTION_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();
httpClient = HttpClientBuilder.create().disableAutomaticRetries().setDefaultRequestConfig(requestConfig)
.setConnectionManager(poolingHttpClientConnectionManager).disableRedirectHandling().build();
你可以看看ConnectionKeepAliveStrategy. Refer to "2.6. Connection keep alive strategy" section of page
如果您正在使用 DefaultHttpClient, it accepts HttpParams,您可以在其中提供连接相关设置。
SO_TIMEOUT 是 SocketTimeout - 以毫秒为单位定义套接字超时 (SO_TIMEOUT),这是等待数据的超时,或者换句话说,两个连续数据包之间的最大不活动时间).
HttpParams httpParams = new BasicHttpParams();
httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT);
httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT);
DefaultHttpClient backend = new DefaultHttpClient(httpParams);
更好的方法是按照@Bandi Kishore 的建议使用 HttpClientBuilder。或者使用 PoolingClientConnectionManager
直接使用 setter 接受这些设置。