httpclient 4.3默认超时设置如何工作,如果没有设置connectiontimeout,connectionmanagertimeout和sockettimeout?

时间:2016-01-02 15:38:14

标签: java httpclient

我最近使用过httpclient 4.3,我知道api已被更改,但如果没有设置超时阈值(conenction或socket或conenctionmanager),它可以工作,这意味着没有无限循环查询,而method.getResponseBodyAsString()会返回一个空字符串,但在文档中,它表示超时的默认参数设置是无限的,那么它是如何工作的?

public class ContentModelUtils {
    private static HttpClient client = new HttpClient();
...
    public static String fetchPlainHttpResult(String id, Map<String, String> result, String getUrl)
                throws HttpException, IOException {
            method = new GetMethod(fetchPlainUrl(id, result, getUrl));
            //client.getParams().setParameter("http.socket.timeout",1000);
            //client.getParams().setParameter("http.connection.timeout",1000);
            //client.getParams().setParameter("http.connection-manager.timeout",10000L);
            client.executeMethod(method);
            if (method.getStatusCode() != 200) {
                return null;
            }
            String outputValue = new String(method.getResponseBodyAsString());

            return outputValue;
        }
...

1 个答案:

答案 0 :(得分:0)

默认设置实际上是无限超时。为了证明这一点,让我们浏览source repository for Apache HttpCore 4.3.x

BasicConnFactory中,我们可以看到它拉动连接超时设置,并且检索超时参数的代码行使用默认值0

this.connectTimeout = params.getIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 0);

稍后,在BasicConnFactory#create中,此超时值将传递到套接字连接。

socket.connect(new InetSocketAddress(hostname, port), this.connectTimeout);

根据Socket#connect的文档,超时值0(我们之前看到的是默认值)被解释为无限超时。

  

使用指定的超时值将此套接字连接到服务器。超时为零被解释为无限超时。然后连接将阻塞,直到建立或发生错误。