十丿四 2015-09-18 08:56 采纳率: 100%
浏览 3632

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

但是把这个部署到服务器上后,使用对方的接口,如果对方处理的时间过长,连接就一直不会断开。导致处理速度一直被拖累。
图片说明

请问这种情况能否解决?

  • 写回答

1条回答 默认 最新

  • snailplus 2015-09-18 15:30
    关注

    SocketTimeout表示,服务器连接成功,但是未响应(未发送数据)时间超过SocketTimeout所设置的时间,
    那么报错(SocketTimeoutException),如果在设置时间内响应了(开始传数据了),那么SocketTimeoutException不会产生。
    当然,如果停止响应超过这个时间也会报错。

    首先确认对方是否持续给客户端响应,如果是连接不会断开。
    对于如何控制持续读取数据的超时,认为服务器那边应该可以设置。
    客户端这边也可以做个监视线程,超过此时间,自己写代码控制打断。
    有无其他方法,不明。

    评论

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作