开发者社区 问答 正文

Httpclient4.3 设置请求超时的问题

多线程使用httpclient调用接口时,一直保持响应,连接不断开。
增加了线程了,和超时的设置,但是仍然不能保证响应过长,断开连接。
把工具的设置贴上来

 private static final CloseableHttpClient httpClient;
    public static final String CHARSET_GBK = "GBK";
    public static final String CHARSET_UTF8 = "UTF-8";
    // 将最大连接数增加到
    public static final int MAX_TOTAL = 600;
    // 将每个路由基础的连接增加到
    public static final int MAX_ROUTE_TOTAL = 300;
    //设置超时时间
    public static final int REQUEST_TIMEOUT = 2 * 1000;
    public static final int REQUEST_SOCKET_TIME = 2 * 1000;

    static {
        // 设置连接超时 的时间
        PoolingHttpClientConnectionManager httpClientConnectionManager = new PoolingHttpClientConnectionManager();
        httpClientConnectionManager.setMaxTotal(MAX_TOTAL);
        httpClientConnectionManager.setDefaultMaxPerRoute(MAX_ROUTE_TOTAL);

        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(REQUEST_TIMEOUT)
                .setSocketTimeout(REQUEST_SOCKET_TIME).build();
        // 设置重定向策略
        LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy();

        httpClient = HttpClients.custom()
                .setConnectionManager(httpClientConnectionManager)
                .setDefaultRequestConfig(requestConfig)
                .setRedirectStrategy(redirectStrategy).build();
    }

使用这个工具自己用了两个测试,一个是测试请求时间,一个测试的响应时间,都能正常的抛出错误。
测试1、请求了google的地址,报错:java.net.SocketTimeoutException: Read timed out
测试2、请求一个测试接口,接口中对请求休眠2000ms
try {

        Thread.sleep(3000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return "hello world";

运行结果:Caused by: java.net.SocketTimeoutException: connect timed out
但是把这个部署到服务器上后,使用对方的接口,如果对方处理的时间过长,连接就一直不会断开。导致处理速度一直被拖累。
screenshot
请问这种情况能否解决?

展开
收起
蛮大人123 2016-03-19 11:54:49 5324 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    这是个3.X的超时设置方法:

    HttpClient client = new HttpClient();  
    client.setConnectionTimeout(30000);   
    client.setTimeout(30000);  
    HttpClient httpClient= new HttpClient();   
    httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);  

    4.X版本的超时设置(4.3后已过时)

    HttpClient httpClient=new DefaultHttpClient();  
    httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,2000);//连接时间  
    httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,2000);//数据传输时间  

    4.3版本超时设置

    CloseableHttpClient httpClient = HttpClients.createDefault();  
    tpGet httpGet=new HttpGet("http://www.baidu.com");//HTTP Get请求(POST雷同)  
    RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();//设置请求和传输超时时间  
    httpGet.setConfig(requestConfig);  
    httpClient.execute(httpGet);//执行请求Http  

    BTW,4.3版本不设置超时的话,一旦服务器没有响应,等待时间N久(>24小时)。

    2019-07-17 19:07:58
    赞同 1 展开评论
问答地址: