【问题标题】:how does httpclient 4.3 default timeout setting work, if not setting connectiontimeout, connectionmanagertimeout, and sockettimeout?httpclient 4.3默认超时设置如何工作,如果没有设置connectiontimeout、connectionmanagertimeout和sockettimeout?
【发布时间】:2016-01-02 15:38:14
【问题描述】:

我最近用的是httpclient 4.3,知道api改了,但是如果不设置超时阈值(conenction or socket or 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;
        }
...

【问题讨论】:

    标签: java httpclient


    【解决方案1】:

    默认设置实际上是无限超时。为了证明这一点,让我们浏览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 的超时值(我们之前看到的是默认值)被解释为无限超时。

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

    【讨论】:

    • Javadoc 在这一点上是不正确的。零连接超时被解释为平台默认超时,大约为一分钟。连接超时不能超过此默认值,只能减少。
    • 我更倾向于同意EJP,因为通过测试,我认为它确实等待大约1分钟然后退出而没有无限循环,但是我说1分钟无法得到任何文件,你能帮帮我吗?
    • @richardzrc,如果您的问题的意图是“什么是没有明确超时设置的 HttpClient 4.3 的合同”,那么我的答案是成立的。如果相反的意图是“为什么我真的看到了大约 1 分钟的超时,即使 JavaDocs 说无限”,那么我建议我们将其作为另一个 EJP 已经回答的问题的副本关闭:stackoverflow.com/questions/13266403/…。 (@EJP,感谢您在此发表评论。)JavaDoc 在技术上是正确的,但可能具有误导性,因为它忽略了操作系统强制执行超时策略的可能性。
    猜你喜欢
    • 2016-06-12
    • 2012-04-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多