如果没有设置连接超时、连接管理超时和套接字超时,那么HttpClient 4.3默认的超时设置是如何工作的?

3

我最近使用了httpclient 4.3,我知道api已经改变了,但是如果不设置超时阈值(连接或套接字或连接管理器),它可以工作,这意味着没有无限循环查询,并且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

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

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


2
Javadoc 在这一点上是不正确的。零连接超时被解释为平台默认超时,大约为一分钟。连接超时不能超过此默认值,只能减少。 - user207421
1
我更倾向于同意EJP的观点,因为经过测试,我认为它确实会等待大约1分钟然后退出而不是无限循环,但我没有找到任何文件说明这一点,你能帮我吗? - richardzrc
@ richardzrc,如果您的问题是“如果没有明确设置超时,则HttpClient 4.3的合同是什么”,那么我的答案是正确的。 如果意图是“为什么我看到大约1分钟的超时,尽管JavaDocs说无限”,那么我建议我们将其关闭作为EJP已回答的另一个问题的重复:https://dev59.com/Z2rXa4cB1Zd3GeqPAI2m。 JavaDoc在技术上是正确的,但可能会误导,因为它忽略了操作系统强制执行超时策略的可能性。 - Chris Nauroth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接