Tomcat, HTTP Keep-Alive et Java's HttpsUrlConnection
J'ai deux serveurs Tomcat qui ont besoin de maintenir une connexion persistante de couper vers le bas sur le protocole SSL handshake. Un serveur (proxy) se trouve dans une zone DMZ, tandis que l'autre est à l'abri derrière un autre pare-feu. Le proxy fondamentalement juste exécute un simple servlet qui effectue certaines vérifications avant la transmission de la demande au cours de la machine. Sur une demande initiale, les machines d'échange de certificats avant d'effectuer le travail réel. C'est pourquoi j'aimerais maintenir une connexion persistante avec un délai d'attente de quelques minutes.
De parler au serveur sécurisé de la servlet sur le serveur proxy utilise HttpsUrlConnection
. J'ai mis en place WireShark et j'ai remarqué que peu importe ce que keepAliveTimeout
valeur que j'ai mis pour le connecteur sécurisé de la machine, la connexion TCP se ferme au bout de 5 ou 10 secondes. Ce nombre semble correspondre avec ce que j'ai lu est le délai d'attente par défaut et comment Java gère HTTP Keep-Alive. Cette lien explique que Java honneurs de la Keep-Alive
délai d'attente s'il est envoyé par le serveur, sinon, il utilise les 5 secondes (connexions directes) ou 10 secondes (pour les connexions proxy) avant de fermer la connexion.
Ce que j'essaie de savoir comment puis-je la force de Tomcat pour envoyer le Keep-Alive-tête. Non, Connection: Keep-Alive
mais Keep-Alive: timeout=x
.
J'ai expérimenté avec le serveur HTTP Apache et la modification de la keepAliveTimeout
dans httpd.conf cause le Keep-Alive-tête pour changer sa valeur de délai d'expiration. En outre, Java ne respecter ce délai.
Mise à JOUR (12/23/11): Après l'exécution de quelques expériences, j'ai essayé de fouetter jusqu'rapide et sale de code à l'aide d'Apache HttpClient (3.1) plutôt que de HttpsUrlConnection
. Il semble que HttpClient, lorsqu'elle est définie à l'utilisation Keep-Alive, attend simplement que le serveur ferme la connexion. Je ne sais pas combien de temps il faudra attendre. Je suis en tournage pour garder la connexion HTTP vivant pendant 3 à 5 minutes.
source d'informationauteur James Sheppard
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure d'utiliser HttpClient 3.1 pour tenir la connexion HTTP ouverte pendant 5 minutes en définissant la keepAliveTimeout dans le connecteur Tomcat à 300000. J'ai vérifié à l'aide de WireShark que le serveur met fin à la connexion pendant HttpClient va tout simplement attendre. Les demandes ultérieures par HttpClient réutilise la connexion TCP existante (évitant toute SSL handshake). La clé est d'avoir un seul HttpClient instance (c'est à dire pas d'en créer un à chaque fois). Cela peut être évident pour la plupart, mais je n'étais pas sûr de ce que l'API de la mécanique pour HTTPClient serait. En bref, créer un HttpClient instance et pour chaque demande (POST, GET, etc.) créer un nouveau PostMethod, GetMethod, etc. Ce sera la cause de la connexion TCP pour être réutilisé.
Dans Tomcat, j'ai réussi à définir les en-têtes dans mon HttpServelet à l'aide de HttpServletResponse.addHeader() comme ceci:
J'ai confirmé avec WireShark que cela ne fonctionne pas avec le HttpUrlConnection sur le côté client. Il ne fonctionne pas si vous ne définissez pas la "Connexion" en-tête, de sorte que vous devez définir.
API Java
Http(s)UrlConnection
honneurs de façon transparente laKeep-Alive
de l'information et de gérer un pool de connexions par serveur hôte selon la la suite des explications détaillées (à lire attentivement - chaque détail est important).Dans ce cas, votre code a à le lire complètement les tampons, près des ruisseaux et erreur de lecture dans le cas de
IOException
.Bien sûr HttpClient a moins de contraintes, mais la meilleure façon de gérer votre situation est l'utilisation de ses
MultiThreadedHttpConnectionManager
grâce à la lignes directrices suivantes.