Définir le délai d'attente HTTP Keep Alive dans le client HTTP Java

introduction

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.

Version JDK à utiliser

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)

Méthode de réglage

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

échantillon

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

Vérifiez la validité des paramètres

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

Définir le délai d'attente HTTP Keep Alive dans le client HTTP Java
Paramètre de délai d'expiration de l'API du client HTTP Java
Quel est le meilleur client HTTP pour Java?
Java (ensemble)
[Java] Définir AdoptOpen JDK dans STS (Eclipse)
[Java Bronze] 5 problèmes à garder à l'esprit
Configurez une interface graphique Java dans un thread séparé pour conserver le
Gardons cela à l'esprit Quoi de neuf dans Java 9
Définissez un affichage contextuel pour le langage Java avec vim.
Partition en Java
Changements dans Java 11
Janken à Java
Client Java mqtt
Taux circonférentiel à Java
FizzBuzz en Java
Obtenez l'URL de la destination de la redirection HTTP en Java