Apache HTTPClient随时都有超时

时间:2016-12-22 21:34:34

标签: java http apache-commons

我正在使用Apache Common的HTTPClient建立HTTP连接。 连接类型是POST,客户端将从连接读取输出。 但是,无论连接状态如何,我都需要能够随时中断连接。这样做的最佳方式是什么? 是否有内置超时? 问候。

编辑: 只是为了澄清我的问题:
我希望用户能够选择何时切断连接 换句话说,与参数cURL类似的功能: CURLOPT_TIMEOUT https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html

2 个答案:

答案 0 :(得分:0)

当您使用HttpClientBuilder实例化httpClient实例时,可以将RequestConfig的实例传递给构建器,该构建器接受2个参数。

SocketTimeout - 以毫秒为单位定义套接字超时(SO_TIMEOUT),这是等待数据的超时,换句话说,两个连续数据包之间的最大周期不活动。)

ConnectTimeout - 确定建立连接之前的超时(以毫秒为单位)。超时值为零被解释为无限超时。

ConnectionRequestTimeout - 返回从连接管理器请求连接时使用的超时(以毫秒为单位)。超时值为零被解释为无限超时。

您正在寻找的是 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。请参阅" 2.6。连接保持活力策略" page

的部分

答案 1 :(得分:0)

如果您使用的是DefaultHttpClient,则会接受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);

更好的方法是使用HttpClientBuilder作为@Bandi Kishore建议。或者使用PoolingClientConnectionManager直接使用setter接受这些设置。