Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
130 views
in Technique[技术] by (71.8m points)

java httpclient超时无效问题

java在调用http请求时需要使用到httpclient发送http请求。(也有其他,我使用的这一个)为了避免调用他人的连接出问题需要设置超时。
我使用的版本是:httpclient-4.5.6

private static PoolingHttpClientConnectionManager connMgr;
    private static RequestConfig requestConfig;
    private static final int MAX_TIMEOUT = 3000;
static {
        // 设置连接池
        connMgr = new PoolingHttpClientConnectionManager();
        // 设置连接池大小
        connMgr.setMaxTotal(100);
        connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());
        // Validate connections after 1 sec of inactivity
        connMgr.setValidateAfterInactivity(1000);
        RequestConfig.Builder configBuilder = Reques
        以上为关键代码:主要设置了tConfig.custom();
        // 设置连接超时
        configBuilder.setConnectTimeout(MAX_TIMEOUT);
        // 设置读取超时
        configBuilder.setSocketTimeout(MAX_TIMEOUT);
        // 设置从连接池获取连接实例的超时
        configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);

        requestConfig = configBuilder.build();
    }

以上为关键代码:设置了settimeout属性赋值给RequestConfig对象。
然后

HttpClient httpClient =  HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();

测试了设置的超时在本地是一切正常的。但是在服务器上这一步很慢。大约需要2分钟。在网上找答案有人说是需要设置重试策略。(我觉得这步跟我的超时没关系,尝试了也不行)。
已经确定了是这个调用http特别慢了,如何处理,想不通为什么设置的超时在服务器不起作用,有可能服务器做了什么限制吗?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

可以试试用jstack在服务器打印一下线程堆栈,看看那2分钟是卡在哪里了。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...