Apache HttpClient: Comment clôturer automatiquement les connexions par serveur keep-alive temps?
Apache HttpClient 4.3b2, HttpCore 4.3.
- Je utiliser PoolingHttpClientConnectionManager
pour gérer 5 connexions simultanées:
PoolingHttpClientConnectionManager connectionManager;
HttpClient httpclient;
connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setDefaultMaxPerRoute(5);
httpclient = HttpClientBuilder.create().setConnectionManager(connectionManager).build();
Serveur 5 secondes temps de persistant.
Lorsque le serveur engager un processus de connexion c'est de rester dans FIN_WAIT2 état jusqu'à ce que je vais exécuter connectionManager.shutdown()
ou connectionManager.closeExpiredConnections()
ou connectionManager.closeIdleConnections(5, TimeUnit.SECONDS)
manuellement. Serveur attend la FIN du paquet. Comment puis-je fermer automatiquement les connexions sur le côté client après le début de serveur d'un processus de clôture?
Quand je fais des demandes à partir du navigateur Chrome, serveur de séjour dans l'état TIME_WAIT quand il essaye de fermer la connexion par keep-alive (FIN_WAIT2 état des changements très rapidement). Comment puis-je obtenir le même comportement avec Apache HttpClient?
OriginalL'auteur Lunigorn | 2013-09-09
Vous devez vous connecter pour publier un commentaire.
Ce problème est expliqué en détails dans HttpClient tutoriel
L'un des principaux défauts de la classique de blocage I/O modèle est que la prise réseau peut réagir à l'I/O les événements uniquement lorsqu'ils sont bloqués dans une opération d'e/S. Lorsqu'une connexion est libérée pour le gestionnaire, il peut être gardé en vie, cependant il est impossible de surveiller l'état de la douille et de réagir à toutes les I/O des événements. Si la connexion se ferme sur le côté serveur, côté client de la connexion est incapable de détecter le changement dans l'état de la connexion (et de réagir de façon appropriée par la fermeture de la socket sur sa fin).
Si vous voulez expiré connexions pour obtenir pro-activement chassés de la connexion de la piscine il n'y a pas moyen de contourner l'exécution d'un thread supplémentaire l'application d'une connexion expulsion de la politique qui convient à votre application.
Donc, en d'autres termes,
PoolingHttpClientConnectionManager
n'est pas en mesure de ré-utiliser les connexions inactives??Votre conclusion est erronée
re-utilise les connexions inactives, après avoir vérifié que leur date d'expiration est encore à l'avenir. C'est juste que si aucune des demandes sont faites pour un certain temps, ces connexions sont toujours ouvertes à partir du côté client (serveur termine en général après un certain temps) à l'aide de ressources. À l'aide d'un thread dédié pour activement la fermeture de ces connexions peuvent libérer ces ressources plus tôt.
Je suis face à un tel problème, @DerekY, qu'entendez-vous par "les connexions sont toujours ouvertes à partir du côté client (serveur termine en général après un certain temps)", à partir de ma compréhension, si le serveur de mettre fin à la connexion, le client ne peut pas le réutiliser, il doit en établir un nouveau, correct?
OriginalL'auteur ok2c
Dans
PoolingHttpClientConnectionManager
classe il y a une méthodesetValidateAfterInactivity
qui définit la période de connexion inactivité en millisecondes. Si cette période a été dépassé le pool de connexion de revalidation de connexion avant de passer à HttpClient.Cette méthode est disponible depuis la v. 4.4.
Dans les versions antérieures
RequestConfig.Builder.setStaleConnectionCheckEnabled
méthode pourrait avoir été utilisé.OriginalL'auteur ivan