首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache HttpClient CoreConnectionPNames.CONNECTION_TIMEOUT什么都不做?

Apache HttpClient CoreConnectionPNames.CONNECTION_TIMEOUT什么都不做?
EN

Stack Overflow用户
提问于 2010-06-09 03:54:49
回答 2查看 12.3K关注 0票数 4

在参数CoreConnectionPNames.CONNECTION_TIMEOUT设置为1的情况下,我从HttpClient得到了奇怪的行为。我本以为HttpGet请求会失败,抛出连接超时异常,但它们还是成功了。这似乎不合理,因为它实际上意味着TCP握手在不到1毫秒内完成。

在这个pom.xml中可以看到,我使用的httpclient版本是

代码语言:javascript
复制
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.0.1</version>
        <type>jar</type>
    </dependency>

代码如下:

代码语言:javascript
复制
import java.io.IOException;
import java.util.Random;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

public class TestNodeAliveness {
    private static Logger log = Logger.getLogger(TestNodeAliveness.class);

    public static boolean nodeBIT(String elasticIP) throws ClientProtocolException, IOException {
        try {
            HttpClient client = new DefaultHttpClient();

            // The time it takes to open TCP connection.
            client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1);

            // Timeout when server does not send data.
            client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);

            // Some tuning that is not required for bit tests.
            client.getParams().setParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false);
            client.getParams().setParameter(CoreConnectionPNames.TCP_NODELAY, true);


            HttpUriRequest request = new HttpGet("http://" + elasticIP);
            HttpResponse response = client.execute(request);

            HttpEntity entity = response.getEntity();
            if(entity == null) { 
                return false;
            } else {
                System.out.println(EntityUtils.toString(entity));
            }

            // Close just in case.
            request.abort();

        } catch (Throwable e) {
            log.warn("BIT Test failed for " + elasticIP);
            e.printStackTrace();

            return false;
        }

        return true;
    }


    public static void main(String[] args) throws ClientProtocolException, IOException {
        nodeBIT("google.com?cant_cache_this=" + (new Random()).nextInt());
    }
}

这怎麽可能?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2010-06-10 05:51:28

在我使用过的所有JVM中,超时的有效粒度大约是15-30ms。即使超时设置为单套接字I/O和connect请求,如果它们花费的时间少于15-30ms,通常也会成功。

票数 5
EN

Stack Overflow用户

发布于 2014-12-10 17:38:36

如果您设置HttpGet的超时,而不是HttpClient,它似乎工作得更好。

代码语言:javascript
复制
    HttpGet httpget = new HttpGet("http://www.apache.org/");

    RequestConfig Default = RequestConfig.DEFAULT;

    RequestConfig requestConfig = RequestConfig.copy(Default)
            .setSocketTimeout(5000)
            .setConnectTimeout(5000)
            .setConnectionRequestTimeout(5000)
            .build();
    httpget.setConfig(requestConfig);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3000767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档