Apache HttpClient CoreConnectionPNames.CONNECTION_TIMEOUT什么都不做?

Max*_*ler 4 java apache-httpclient-4.x

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

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

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.0.1</version>
        <type>jar</type>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

这是代码:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这怎么可能?谢谢.

ok2*_*k2c 5

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

  • 那么你如何有效地设置一个超时,如果你在5秒后没有收到来自服务器的响应,你会抛出异常? (2认同)