java-commons-HttpClient超时设置setConnectionTimeout和setSoTimeout

问题

之前使用httpclient请求数据

源码方法:

    public static String doHttp(HttpMethod result, int timeout, String charset) {
        HttpClient client = new HttpClient();
        try {
            HttpConnectionManagerParams managerParams = client.getHttpConnectionManager().getParams();
            managerParams.setConnectionTimeout(timeout);
            client.executeMethod(result);
            InputStream resStream = result.getResponseBodyAsStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(resStream, charset));
            StringBuffer resBuffer = new StringBuffer();
            String resTemp = "";
            while ((resTemp = br.readLine()) != null) {
                resBuffer.append(resTemp);
            }
            return resBuffer.toString();
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            result.releaseConnection();
        }
        return null;
    }

发现其中在

client.executeMethod(result);

一只会卡在这里不出来,究其原因在于对

managerParams.setConnectionTimeout(timeout);//为连接超时

这里使用的是连接超时,而我这里还缺少了一个数据超时,否则会一直等待数据返回所以在下面在添加请求数据超时代码。

以下为完整的代码:(其中红色部分为这次的主角)

    public static String doHttp(HttpMethod result, int timeout, String charset) {
        HttpClient client = new HttpClient();
        try {
            HttpConnectionManagerParams managerParams = client.getHttpConnectionManager().getParams();
            managerParams.setConnectionTimeout(timeout);
            managerParams.setSoTimeout(timeout);//等待结果超时
            client.executeMethod(result);
            InputStream resStream = result.getResponseBodyAsStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(resStream, charset));
            StringBuffer resBuffer = new StringBuffer();
            String resTemp = "";
            while ((resTemp = br.readLine()) != null) {
                resBuffer.append(resTemp);
            }
            return resBuffer.toString();
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            result.releaseConnection();
        }
        return null;
    }

看介绍

本文介绍来自http://jinnianshilongnian.iteye.com/blog/2089792

参数设置

1、httpclient 4.2.3

HttpParams params = new BasicHttpParams();
//设置连接超时时间
Integer CONNECTION_TIMEOUT = 2 * 1000; //设置请求超时2秒钟 根据业务调整
Integer SO_TIMEOUT = 2 * 1000; //设置等待数据超时时间2秒钟 根据业务调整
//定义了当从ClientConnectionManager中检索ManagedClientConnection实例时使用的毫秒级的超时时间
//这个参数期望得到一个java.lang.Long类型的值。如果这个参数没有被设置,默认等于CONNECTION_TIMEOUT,因此一定要设置
Long CONN_MANAGER_TIMEOUT = 500L; //该值就是连接不够用的时候等待超时时间,一定要设置,而且不能太大 ()

params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT);
params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SO_TIMEOUT);
params.setLongParameter(ClientPNames.CONN_MANAGER_TIMEOUT, CONN_MANAGER_TIMEOUT);
//在提交请求之前 测试连接是否可用
params.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, true);

PoolingClientConnectionManager conMgr = new PoolingClientConnectionManager();
conMgr.setMaxTotal(200); //设置整个连接池最大连接数 根据自己的场景决定
//是路由的默认最大连接(该值默认为2),限制数量实际使用DefaultMaxPerRoute并非MaxTotal。
//设置过小无法支持大并发(ConnectionPoolTimeoutException: Timeout waiting for connection from pool),路由是对maxTotal的细分。
conMgr.setDefaultMaxPerRoute(conMgr.getMaxTotal());//(目前只有一个路由,因此让他等于最大值)

//另外设置http client的重试次数,默认是3次;当前是禁用掉(如果项目量不到,这个默认即可)
httpClient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));

此处解释下MaxtTotal和DefaultMaxPerRoute的区别:

1、MaxtTotal是整个池子的大小;

2、DefaultMaxPerRoute是根据连接到的主机对MaxTotal的一个细分;比如:

MaxtTotal=400 DefaultMaxPerRoute=200

而我只连接到http://xx.com时,到这个主机的并发最多只有200;而不是400;

而我连接到 http://xx.com和 http://xxx.com时,到每个主机的并发最多只有200;即加起来是400(但不能超过400);所以起作用的设置是DefaultMaxPerRoute。

2、httpclient 3.1

HttpConnectionManagerParams params = new HttpConnectionManagerParams();
params.setConnectionTimeout(2000);
params.setSoTimeout(2000);
// 最大连接数
params.setMaxTotalConnections(500);
params.setDefaultMaxConnectionsPerHost(500);
params.setStaleCheckingEnabled(true);
connectionManager.setParams(params);

HttpClientParams httpClientParams = new HttpClientParams();
// 设置httpClient的连接超时,对连接管理器设置的连接超时是无用的
httpClientParams.setConnectionManagerTimeout(5000); //等价于4.2.3中的CONN_MANAGER_TIMEOUT
httpClient = new HttpClient(connectionManager);
httpClient.setParams(httpClientParams);

//另外设置http client的重试次数,默认是3次;当前是禁用掉(如果项目量不到,这个默认即可)
httpClientParams.setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false));
 

参数类似 就不多解释了;

另看一片转载内容

HttpClient 4 和 HttpClient 3 设置超时

HttpClient 4:
连接超时:

httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,60000);

// 或者

HttpConnectionParams.setConnectionTimeout(params, 6000);

读取超时:

httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,60000);

// 或者

HttpConnectionParams.setSoTimeout(params, 60000);

HttpClient 3:
连接超时:

httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(60000);

读取超时:

httpClient.getHttpConnectionManager().getParams().setSoTimeout(60000);
时间: 2024-11-12 04:25:35

java-commons-HttpClient超时设置setConnectionTimeout和setSoTimeout的相关文章

java commons HttpClient登录oschina

原文:java commons HttpClient登录oschina 代码下载地址:http://www.zuidaima.com/share/1550463226612736.htm 谁能帮忙提供完整的类似osc上这个哥们的代码呢?急急急.http://www.oschina.net/code/snippet_580223_12341 运行结果,基本和你的需求达成一致,感谢投递者 由Wood编辑于2013-12-19 8:36:37 java commons HttpClient登录osch

HttpClient超时设置

场景:最近并发较高,看到响应时间6s的时候,心里咯噔一下,我记得我设置的超时时间是5s啊.   原来读取超时时间没生效,只生效了连接超时时间. ConnectionTimeout:这定义了通过网络与服务器建立连接的超时时间.Httpclient包中通过一个异步线程去创建与服务器的socket连接,这就是该socket连接的超时时间,此处设置为3秒. 将url改为一个不存在的url,则会抛出org.apache.commons.httpclient.ConnectTimeoutException

Java中httpClient中三种超时设置

本文章给大家介绍一下关于Java中httpClient中的三种超时设置小结 在Apache的HttpClient包中,有三个设置超时的地方: /* 从连接池中取连接的超时时间*/ ConnManagerParams.setTimeout(params, 1000); /*连接超时*/ HttpConnectionParams.setConnectionTimeout(params, 2000); /*请求超时*/ HttpConnectionParams.setSoTimeout(params,

HttpClient库设置超时

HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样. 3.X是正常的Java语法 HttpClient httpClient=new DefaultHttpClient(); 4.3变成了工厂模式 CloseableHttpClient httpClient = HttpClients.createDefault(); 超时设置方法 3.x HttpClient client = new Ht

org.apache.http.client.HttpClient; HttpClient 4.3超时设置

可用的code public static String doPost(String url, String params, String contentType) /*throws IOException */{ CloseableHttpClient client = HttpClients.createDefault(); RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(httpSoTimeout)

HttpClient超时的用法

HttpClient在运用中有两个超时时刻,是一向接触和运用的,由于前次工作中运用httpClient造成了体系悲惨剧的情况,特别对它的两个超时时刻进行了小小的测验,在这里记录下. 测验版别为HttpClient——3.1 一:衔接超时:connectionTimeout 1:指的是衔接一个url的衔接等待时刻. 2:设置办法为: public class TestHttpClientMain { /** * @param args */ public static void main(Stri

org.apache.commons.httpclient

org.apache.commons.httpclient 1 /** 2 * post 方法 3 * @param url 4 * @param params 5 * @return 6 */ 7 public static String post(String url, Object content, String encode) throws Exception { 8 9 byte[] responseBody = null; 10 HttpClient httpclient = new

commons-httpclient中的超时设置

connectionTimeout与soTimeout的差异,前者指创建一个有效的客户端到服务端链接的最大允许时间,后者指socket接收data的时间. connectionManager.getParams().setConnectionTimeout(50); connectionManager.getParams().setSoTimeout(100); 调用connectionTimeout属性的代码: //org.apache.commons.httpclient.protocol.

java之httpClient 3.x、AsyncHttpClient1.9.x使用总结

首先请大牛们见谅菜鸟重复造轮子的学习方式,本文适合新手看~ 下面使用的同步http是HttpClient 3.X的版本,不过早已不在维护,如果刚开始使用http,建议大家都换成4.X版本,别看下面的有关同步http的部分了,4.x效率有质地提高,总结3.X只是因为无奈旧项目还在使用.后面再更新一篇有关4.x的,最新的HttpClient 4.X官方地址:http://hc.apache.org/httpcomponents-client-4.5.x/index.html 但鉴于可能有些旧的系统还