Ceci est un exemple pour définir le délai d'attente HTTP Keep Alive dans le client HTTP introduit à partir d'Open JDK 11.
C'est une bonne règle de rendre la valeur Keep Alive Timeout côté client plus courte que celle côté serveur afin d'éviter les erreurs de communication lorsque la connexion est fermée du côté serveur et que la demande du client est traitée en même temps.
Par conséquent, il est important de connaître la méthode de paramétrage côté client.
Utilisez le dernier Open JDK 13 au moment de la rédaction. Il utilise également jshell pour exécuter le code. En passant, jshell est vraiment utile.
~ $ 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)
Le délai d'attente du client HTTP peut être défini avec la propriété java jdk.httpclient.keepalive.timeout
.
-Djdk.httpclient.keepalive.timeout=60
Ou
System.setProperty("jdk.httpclient.keepalive.timeout", "99999");
Il peut être défini par une telle méthode.
Ce paramètre est lu par la classe jdk.internal.net.http.ConnectionPool
.
Puisque la variable qui contient la valeur du délai d'expiration est statique, elle doit être définie avant de charger la classe ci-dessus, et il semble qu'elle ne puisse pas être modifiée après le chargement (non vérifiée).
En ce qui concerne le code source, la valeur par défaut pour Open JDK 13 est de 1200 secondes.
La source de ConnectionPool (JDK 13) est [ici](https://github.com/openjdk/jdk13/blob/master/src/java.net.http/share/classes/jdk/internal/net/http/ConnectionPool Vous pouvez vous y référer à partir de .java).
Ceci est un exemple dans jshell. HTTP GET sur qiita.com. Réglez le délai de maintien en vie sur 10 secondes
exemple d'exécution jshell
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
Comme il n'est pas possible de vérifier si la valeur du délai d'expiration a changé avec l'exemple ci-dessus seul, essayez de surveiller l'état TCP avec la commande OS netstat. Dans l'exemple ci-dessous, la commande netstat est exécutée toutes les secondes et les résultats de la commande sont limités par l'adresse IP publique de qiita.com.
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
Jeudi 21 novembre 2019 18:31:34 JST
Jeudi 21 novembre 2019 18:31:35 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:36 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:37 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:38 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:39 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:40 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:41 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:42 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:43 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:44 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:45 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 ESTABLISHED
Jeudi 21 novembre 2019 18:31:46 JST
tcp4 0 0 xxx.xxx.xxx.xxx.62156 13.114.xxx.xxx.443 TIME_WAIT
Une fois la connexion TCP établie, elle devient ʻESTABLISHED pendant 10 secondes et est activement fermée 1 seconde plus tard, de sorte que vous pouvez voir qu'elle est passée à
TIME_WAIT`.
J'ai pu confirmer que les paramètres sont valides.
Recommended Posts