Comment réparer java.net.Exception socketexception: Broken pipe?
Je suis à l'aide d'apache commons http client à l'appel de l'url à l'aide de la méthode post pour poster les paramètres et il est en train de jeter l'erreur ci-dessous rarement.
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
at java.io.FilterOutputStream.write(FilterOutputStream.java:80)
at org.apache.commons.httpclient.methods.ByteArrayRequestEntity.writeRequest(ByteArrayRequestEntity.java:90)
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
Quelqu'un peut-il suggérer ce qui est à l'origine de cette Exception et comment le corriger?
- À quelle fréquence (nombre de fois par seconde) faites-vous votre poste d'appels?
- De 5 à 10 appels par seconde.
- c'est mieux d'essayer de stackoverflow.com/questions/10142409/...
Vous devez vous connecter pour publier un commentaire.
Cela est causé par:
Dans les deux cas, vous avez un mal définis ou mis en œuvre le protocole d'application.
Il y a une troisième raison pour laquelle je ne vais pas le document, mais qui implique les pairs de prendre une action délibérée pour réinitialiser plutôt que de fermer correctement la connexion.
XMLHttpRequest.abort()
).Dans notre cas, nous avons expérimenté cette lors de l'exécution d'un test de charge sur notre serveur d'application. La question s'est avéré que nous avons besoin d'ajouter de la mémoire supplémentaire à notre JVM parce qu'il était compté. Cette résolu le problème.
Essayez d'augmenter la mémoire disponible pour la JVM et de surveiller l'utilisation de la mémoire lorsque vous obtenez ces erreurs.
Exception socketexception: Broken pipe, est causée par "l'autre bout" (le client ou Le serveur) fermeture de la connexion alors que votre code est soit en lecture ou écriture à la connexion.
C'est un très commun exception dans les applications client/serveur qui reçoivent le trafic des clients ou des serveurs en dehors du contrôle de l'application. Par exemple, le client est un navigateur. Si le navigateur fait un appel Ajax, et/ou l'utilisateur ferme la page ou navigateur, alors cela peut effectivement tuer toutes les communications de façon inattendue. Fondamentalement, vous obtiendrez cette erreur tout moment l'autre extrémité se termine leur application, et vous ne s'attendaient pas à ça.
Si vous rencontrez cette Exception dans votre application, cela signifie que vous devriez vérifier votre code où l'e /s (Entrée/Sortie) se produit et l'envelopper avec un bloc try/catch pour attraper cette IOException. C'est alors, à vous de décider comment vous voulez gérer ce semi-valides situation.
Dans votre cas, le premier endroit où vous avez toujours le contrôle est l'appel à
HttpMethodDirector.executeWithRetry
- Afin de s'assurer que l'appel est enveloppé avec le bloc try/catch, et de les traiter de la façon dont vous voyez l'ajustement.Je conseille vivement contre la journalisation exception socketexception-Broken Pipe erreurs spécifiques à rien d'autre que de débogage/niveaux de trace. Autre chose, il peut être utilisé comme une forme de Déni De Service (DOS) attaque en remplissant les journaux. Essayez et de se durcir et de négatif de test de votre application pour ce scénario.
Tous les cours d'eau & connexions doivent être correctement fermés, de sorte que la prochaine fois que nous essayons d'utiliser le urlConnection objet, il ne renvoie pas d'erreur. Par exemple, le code suivant changement de correction de l'erreur pour moi.
Avant:
Après:
BufferedOutputStream
appelle toujoursclose()
sur sous-jacentes de ses flux de sortie (donc sur le flux de sortie deurlConnection
). Voir docs.oracle.com/javase/6/docs/api/java/io/... et docs.oracle.com/javase/6/docs/api/java/io/... Ainsi, lorsque vous appelezos.close()
il doit avoir été déjà fermé. Non?J'ai mis en œuvre la fonctionnalité de téléchargement de données via serveur FTP et a constaté la même exception il y a trop lors de la reprise de télécharger.
Pour résoudre cette exception, vous aurez toujours à se déconnecter de la session précédente et de créer une nouvelle instance du Client et de la nouvelle connexion avec le serveur. Cette même approche pourrait être utile pour HTTPClient trop.
Le problème pourrait être que votre déployé fichiers ne sont pas mis à jour avec le bon RMI méthodes. Vérifiez que votre RMI interface a mis à jour les paramètres de mise à jour des structures de données que votre client n'a pas. Ou que votre RMI client n'a pas de paramètres qui diffèrent de ce que votre version du serveur a.
C'est juste une supposition éclairée. Après re-déploiement de mon application serveur de fichiers de classe et re-test, le problème de la "Broken pipe" s'en alla.
Les réponses ci-dessus illustrent la raison de cette
java.net.SocketException: Broken pipe
: l'autre bout fermé la connexion. Je voudrais partager l'expérience de ce qui s'est passé quand je l'ai rencontrée:Content-Type
en-tête est à tort plus grand que du corps de la requête est en fait (en fait il n'y a pas de corps du tout)Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
java.net.SocketTimeoutException: null
java.net.SocketException: Broken pipe
parce que le client a fermé.Parfois, tomcat ne jette pas cassé pip exception, parce exception délai de fermer la connexion, pourquoi une telle différence est source de confusion, moi aussi.
Content-Type
en-tête n'est pas en mesure de spécifier un certain nombre, de sorte qu'il ne peut pas " être plus grand que tout. Exceptions d'expiration de ne pas fermer le socket. La réponse ne fait aucun sens que ce soit.La cause est que l'homologue distant ferme son support (crash par exemple), donc, si vous essayez d'écrire des données sur lui, par exemple, vous obtiendrez ceci. pour le résoudre, à protéger en lecture/écriture à la prise d'opérations entre (try catch), puis gérer l'perds la connexion de cas dans le catch (renouveler la connexion, programme stop, ...etc):
Vous devez augmenter "arriéré" paramètre de votre ServerSocket, par exemple