Festlegen des HTTP-Keep-Alive-Timeouts im Java-HTTP-Client

Einführung

Dies ist ein Beispiel zum Festlegen des HTTP-Keep-Alive-Timeouts im HTTP-Client, der von Open JDK 11 eingeführt wurde.

Es ist eine gute Regel, den Wert "Keep Alive Timeout" auf der Clientseite kürzer als den auf der Serverseite zu machen, um Kommunikationsfehler zu vermeiden, wenn die Verbindung von der Serverseite geschlossen wird und die Anforderung vom Client gleichzeitig verarbeitet wird.

Daher ist es wichtig, die Einstellungsmethode auf der Clientseite zu kennen.

JDK-Version zu verwenden

Verwenden Sie zum Zeitpunkt des Schreibens das neueste Open JDK 13. Es verwendet auch jshell, um den Code auszuführen. Abgesehen davon ist jshell wirklich nützlich.

~ $ java --version
openjdk 13.0.1 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)

Einstellmethode

Das HTTP-Client-Keep-Alive-Timeout kann mit der Java-Eigenschaft "jdk.httpclient.keepalive.timeout" festgelegt werden.

-Djdk.httpclient.keepalive.timeout=60 Oder System.setProperty("jdk.httpclient.keepalive.timeout", "99999"); Sie kann mit einer solchen Methode eingestellt werden.

Diese Einstellung wird von der Klasse "jdk.internal.net.http.ConnectionPool" gelesen. Da die Variable, die den Timeout-Wert enthält, statisch ist, muss sie vor dem Laden der obigen Klasse festgelegt werden, und es scheint, dass sie nach dem Laden nicht geändert werden kann (nicht überprüft). Für den Quellcode beträgt der Standardwert für Open JDK 13 1200 Sekunden.

Die Quelle von ConnectionPool (JDK 13) ist hier Sie können von .java) darauf verweisen.

Stichprobe

Dies ist ein Beispiel in jshell. HTTP GET zu qiita.com. Stellen Sie das Keep Alive Timeout auf 10 Sekunden ein.

jshell Ausführungsbeispiel


jshell> import java.net.http.*

jshell> System.setProperty("jdk.httpclient.keepalive.timeout", "10")
$1 ==> null

jshell> HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build()
client ==> jdk.internal.net.http.HttpClientImpl@57baeedf(1)

jshell> HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://qiita.com")).build()
request ==> https://qiita.com GET

jshell> HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString())
response ==> (GET https://qiita.com) 200

Überprüfen Sie die Gültigkeit der Einstellungen

Versuchen Sie, den TCP-Status mit dem Befehl netstat des Betriebssystems zu überwachen, da allein mit dem obigen Beispiel nicht überprüft werden kann, ob sich der Timeout-Wert geändert hat. Im folgenden Beispiel wird der Befehl netstat jede Sekunde ausgeführt, und die Befehlsergebnisse werden durch die öffentliche IP-Adresse von qiita.com eingegrenzt.

netstat


while true; do date; netstat -n -p TCP | egrep "13.114.xxx.xxx|176.34.xxx.xxx|13.113.xxx.xxx"; sleep 1; done

Donnerstag, 21. November 2019, 18:31:34 JST
Donnerstag, 21. November 2019, 18:31:35 Uhr JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:36 JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:37 Uhr JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:38 Uhr JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:39 JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:40 Uhr JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:41 Uhr JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:42 Uhr JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:43 JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:44 JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:45 Uhr JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     ESTABLISHED
Donnerstag, 21. November 2019, 18:31:46 JST
tcp4       0      0  xxx.xxx.xxx.xxx.62156    13.114.xxx.xxx.443     TIME_WAIT

Nachdem die TCP-Verbindung hergestellt wurde, wird sie 10 Sekunden lang "ESTABLISHED" und 1 Sekunde später aktiv geschlossen, sodass Sie sehen können, dass sie zu "TIME_WAIT" verschoben wurde.

Ich konnte bestätigen, dass die Einstellungen gültig sind.

Recommended Posts

Festlegen des HTTP-Keep-Alive-Timeouts im Java-HTTP-Client
Java HTTP Client API-Zeitlimiteinstellung
Welcher ist der beste HTTP-Client für Java?
Java (gesetzt)
[Java] Setzen Sie AdoptOpen JDK in STS (Eclipse)
[Java Bronze] 5 Probleme zu beachten
Richten Sie eine Java-GUI in einem separaten Thread ein, um die Haupt-GUI beizubehalten
Denken wir daran, was in Java 9 neu ist
Stellen Sie mit vim die Popup-Anzeige für die Java-Sprache ein.
Partisierung in Java
Änderungen in Java 11
Janken in Java
Java mqtt Client
Umfangsrate in Java
FizzBuzz in Java
Rufen Sie die URL des HTTP-Umleitungsziels in Java ab