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