J'ai une application Web et un client, écrits en Java. Pour ce que ça vaut, le client et le serveur sont tous les deux sur Windows. Le client émet des requêtes GET HTTP via Apache HttpClient. Le serveur bloque pendant une minute et si aucun message n'est arrivé pour le client dans cette minute, le serveur renvoie HTTP 204 No Content. Sinon, dès qu'un message est prêt pour le client, il est renvoyé avec le corps d'un HTTP 200 OK.Qu'est-ce qui peut faire que TCP/IP abandonne les paquets sans abandonner la connexion?
Voici ce qui me laisse perplexe: pour un sous-ensemble par intermittence spécifique de clients - toujours les clients avec des connexions réseau manifestement feuilletés - le client émet une requête GET, le serveur reçoit et traite l'EEG, mais le client est assis pour toujours . En activant les journaux de débogage pour le client, je vois que HttpClient attend toujours la toute première ligne de la réponse.
Il n'y a pas d'exception lancée sur le serveur, au moins, rien n'est enregistré, pas par Tomcat, ni par ma webapp. Selon les journaux de débogage, il y a tous les signes que le serveur a répondu avec succès au client. Cependant, le client ne montre aucun signe d'avoir reçu quoi que ce soit. Le client se bloque indéfiniment dans HttpClient.executeMethod. Cela devient évident une fois la session expirée et le client prend une action qui provoque l'exécution d'un POST HTTP par un autre thread. Bien sûr, le test POST échoue car la session a expiré. Dans certains cas, heures se sont écoulées entre la session expirant et le client émettant un POST et découvrant ce fait. Pendant tout ce temps, executeMethod
attend toujours la ligne de réponse HTTP.
Lorsque j'utilise WireShark pour voir ce qui se passe réellement au niveau du câblage, cette défaillance ne se produit pas. C'est-à-dire que cet échec se produira dans quelques heures pour des clients spécifiques, mais lorsque WireShark est en cours d'exécution aux deux extrémités, ces mêmes clients s'exécuteront pendant une nuit, 14 heures, sans échec.
Est-ce que quelqu'un d'autre a rencontré quelque chose comme ça? Qu'est-ce qui peut le provoquer dans le monde? Je pensais que le protocole TCP/IP garantissait la livraison des paquets même à travers les problèmes de réseau à court terme. Si je définis un SO_TIMEOUT et que j'essaye immédiatement la demande au moment de l'expiration, la nouvelle tentative réussit toujours. (Bien sûr, je commence par abort la demande expiré et libère la connexion pour m'assurer qu'une nouvelle socket sera utilisée.)
Réflexions? Des idées? Existe-t-il un paramètre TCP/IP disponible pour Java ou un paramètre de registre dans Windows qui activera des tentatives TCP/IP plus agressives sur les paquets perdus?
Des sons comme l'observation changent le résultat -> Heisenbug -> quelque chose ne va pas avec le filetage. Dans ce cas, il semble que quelqu'un va trop _fast_ (je mettrais mon argent sur HttpClient) et simplement des blocages à cause de cela. Il est possible que vous ayez rencontré un bogue dans HttpClient lui-même, j'espère que d'autres pourront vous aider et vous aider à résoudre ce problème. – Esko