Apache HttpClient CoreConnectionPNames.CONNECTION_TIMEOUT ne fait rien?
- Je obtenir de l'étrange comportement de HttpClient avec le paramètre CoreConnectionPNames.CONNECTION_TIMEOUT la valeur 1.
Je m'attends à ce que HttpGet demande échoue, jetant délai d'attente de connexion exception et pourtant, ils sont couronnés de succès. Cela semble irrationnel que cela signifie en fait que le protocole TCP handshake fini en moins de 1 milliseconde.
La httpclient version que je suis en utilisant comme on peut le voir dans cette pom.xml est
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0.1</version>
<type>jar</type>
</dependency>
Voici le code:
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());
}
}
Comment est-ce possible?
Merci.
OriginalL'auteur Maxim Veksler | 2010-06-08
Vous devez vous connecter pour publier un commentaire.
L'efficacité de la granularité des délais d'attente dans toutes les machines virtuelles, j'ai travaillé avec est d'environ 15-30ms. Même si le délai d'attente est fixé à 1 socket d'e/S et les demandes de connexion susceptibles de réussir si elles prennent de moins de 15 30ms.
OriginalL'auteur ok2c
Si vous définissez le délai d'attente de la HttpGet,au lieu de la HttpClient, il semble fonctionner beaucoup mieux.
OriginalL'auteur Greg King