Ich möchte BIT (Built in Tests) für eine Reihe von Servern in meiner Cloud erstellen. Ich brauche die Anfrage, um bei großer Zeitüberschreitung fehlzuschlagen.
Wie soll ich das mit Java machen?
Es scheint nicht zu funktionieren, so etwas wie das Folgende zu versuchen.
public class TestNodeAliveness {
public static NodeStatus nodeBIT(String elasticIP) throws ClientProtocolException, IOException {
HttpClient client = new DefaultHttpClient();
client.getParams().setIntParameter("http.connection.timeout", 1);
HttpUriRequest request = new HttpGet("http://192.168.20.43");
HttpResponse response = client.execute(request);
System.out.println(response.toString());
return null;
}
public static void main(String[] args) throws ClientProtocolException, IOException {
nodeBIT("");
}
}
- BEARBEITEN: Klären Sie, welche Bibliothek verwendet wird -
Ich verwende httpclient von Apache. Hier ist der entsprechende Abschnitt pom.xml
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0.1</version>
<type>jar</type>
</dependency>
java
http
timeout
network-protocols
Maxim Veksler
quelle
quelle
Antworten:
quelle
Wenn Sie Http Client Version 4.3 und höher verwenden, sollten Sie Folgendes verwenden:
quelle
SocketTimeout
. Bedeutet "Standard" auch, dass es Standard für alles istHttpClient
, was die Methode "HttpClientBuilder
from create ()" durchgibtbuild()
? Oder nur diejenigen, die durchgehensetDefaultRequestConfig(requestConfig)
? Mache ich Sinn?HttpParams ist in der neuen Apache HTTPClient-Bibliothek veraltet. Die Verwendung des von Laz bereitgestellten Codes führt zu Verfallswarnungen.
Ich schlage vor, RequestConfig stattdessen für Ihre HttpGet- oder HttpPost-Instanz zu verwenden:
quelle
RequestConfig
in EveryHttpPost
und dem Setzen als Standard in dasHttpClient
?Es sieht so aus, als würden Sie die HttpClient-API verwenden, von der ich nichts weiß, aber Sie könnten mit Java-Kern etwas Ähnliches schreiben.
quelle
Ich fand das Einstellen der Timeout-Einstellungen in
HttpConnectionParams
undHttpConnectionManager
löste unseren Fall nicht. Wir können nurorg.apache.commons.httpclient
Version 3.0.1 verwenden.Am Ende habe ich ein verwendet
java.util.concurrent.ExecutorService
, um denHttpClient.executeMethod()
Anruf zu überwachen .Hier ist ein kleines, in sich geschlossenes Beispiel
quelle
Die genannte Methode mit den höchsten Up-Werten von Laz ist ab Version 4.3 veraltet. Daher ist es besser, das Request Config Object zu verwenden und dann den HTTP-Client zu erstellen
Mit dem PoolingHttpClientConnectionManager kann der Benutzer die maximale Standardanzahl von Verbindungen und die maximale Anzahl von Verbindungen pro Route festlegen. Ich habe es auf 306 bzw. 108 eingestellt. Die Standardwerte sind in den meisten Fällen nicht ausreichend.
Zum Festlegen des Zeitlimits : Ich habe das RequestConfig-Objekt verwendet. Sie können auch die Eigenschaft Verbindungsanforderungszeitlimit festlegen, um das Zeitlimit für das Warten auf die Verbindung vom Verbindungsmanager festzulegen.
quelle
Dies wurde bereits in einem Kommentar von Benvoliot oben erwähnt. Aber ich denke, es ist einen Beitrag auf höchstem Niveau wert, weil ich mich sicher am Kopf gekratzt habe. Ich poste dies für den Fall, dass es jemand anderem hilft.
Ich habe einen einfachen Testclient geschrieben und das
CoreConnectionPNames.CONNECTION_TIMEOUT
Timeout funktioniert in diesem Fall perfekt. Die Anforderung wird abgebrochen, wenn der Server nicht antwortet.Innerhalb des Servercodes, den ich tatsächlich zu testen versuchte, tritt jedoch nie eine Zeitüberschreitung des identischen Codes auf.
Das Problem wurde für mich behoben, indem das Zeitlimit für die Socket-Verbindungsaktivität (
CoreConnectionPNames.SO_TIMEOUT
) anstelle der HTTP-Verbindung (CoreConnectionPNames.CONNECTION_TIMEOUT
) geändert wurde.Lesen Sie auch die Apache-Dokumente sorgfältig durch: http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/params/CoreConnectionPNames.html#CONNECTION_TIMEOUT
Beachten Sie das Bit, das sagt
Ich hoffe, das erspart jemand anderem den ganzen Kopfkratzer, den ich durchgemacht habe. Das wird mich lehren, die Dokumentation nicht gründlich zu lesen!
quelle
Op gab später an, dass sie Apache Commons HttpClient 3.0.1 verwenden
quelle
HttpConnectionParams.setSoTimeout(params, 10*60*1000);// for 10 mins i have set the timeout
Sie können auch Ihre erforderliche Auszeit definieren.
quelle