Apache HttpClient CoreConnectionPNames.CONNECTION_TIMEOUT什么都不做?

我从HttpClient获取奇怪的行为,参数CoreConnectionPNames.CONNECTION_TIMEOUT设置为1.我希望HttpGet请求失败,抛出连接超时exception但它们是成功的。 这似乎是不合理的,因为它实际上意味着TCP握手在不到1毫秒内完成。

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

 org.apache.httpcomponents httpclient 4.0.1 jar  

这是代码:

 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()); } } 

这怎么可能? 谢谢。

我使用的所有JVM中有效的超时粒度大约是15-30ms。 即使超时设置为1个套接字I / O,连接请求通常也会成功,如果它们的时间少于15-30毫秒。

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

  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);