Qu’est-ce qui cause mon java.net.SocketException: la réinitialisation de la connexion?

Nous voyons fréquemment java.net.SocketException: Connection reset erreurs de java.net.SocketException: Connection reset dans nos journaux pour un composant qui appelle un service Web tiers qui envoie des messages SMS.

Notre application est écrite en Java et s’exécute sur Tomcat 5.5. Il a été écrit par des entrepreneurs qui ne sont plus avec nous. L’équipe actuelle n’a pas de véritable expertise Java et nous ne soaps pas d’où provient l’erreur de Connection reset la Connection reset et comment procéder au débogage.

Le problème semble être complètement intermittent et sans rapport avec les messages que nous essayons d’envoyer.

Toutes les suggestions sur les causes typiques de cette exception et sur la manière dont nous pourrions procéder sont les bienvenues.

La stack d’appels entière est incluse ci-dessous pour être complet.

( com.companyname.mtix.sms est notre composant)


     java.net.SocketException: réinitialisation de la connexion
         at java.net.SocketInputStream.read (SocketInputStream.java:168)
         à java.io.BufferedInputStream.fill (BufferedInputStream.java:218)
         at java.io.BufferedInputStream.read (BufferedInputStream.java:235)
         at org.apache.commons.httpclient.HttpParser.readRawLine (HttpParser.java:77)
         at org.apache.commons.httpclient.HttpParser.readLine (HttpParser.java:105)
         at org.apache.commons.httpclient.HttpConnection.readLine (HttpConnection.java:1115)
         at org.apache.commons.httpclient.HttpMethodBase.readStatusLine (HttpMethodBase.java:1832)
         at org.apache.commons.httpclient.HttpMethodBase.readResponse (HttpMethodBase.java:1590)
         at org.apache.commons.httpclient.HttpMethodBase.execute (HttpMethodBase.java:995)
         at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry (HttpMethodDirector.java:397)
         at org.apache.commons.httpclient.HttpMethodDirector.executeMethod (HttpMethodDirector.java:170)
         at org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:396)
         at org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:324)
         à com.companyname.mtix.sms.services.impl.message.SendTextMessage.sendTextMessage (SendTextMessage.java:127)
         at com.companyname.mtix.sms.services.MessageServiceImpl.sendTextMessage (MessageServiceImpl.java:125)
         at com.companyname.mtix.sms.services.remote.MessageServiceRemoteImpl.sendTextMessage (MessageServiceRemoteImpl.java:43)
         at sun.reflect.GeneratedMethodAccessor203.invoke (Source inconnue)
         at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)
         at java.lang.reflect.Method.invoke (Method.java:585)
         at org.apache.axis.providers.java.RPCProvider.invokeMethod (RPCProvider.java:397)
         at org.apache.axis.providers.java.RPCProvider.processMessage (RPCProvider.java:186)
         at org.apache.axis.providers.java.JavaProvider.invoke (JavaProvider.java:323)
         at org.apache.axis.strategies.InvocationStrategy.visit (InvocationStrategy.java:32)
         à org.apache.axis.SimpleChain.doVisiting (SimpleChain.java:118)
         at org.apache.axis.SimpleChain.invoke (SimpleChain.java:83)
         at org.apache.axis.handlers.soap.SOAPService.invoke (SOAPService.java:453)
         at org.apache.axis.server.AxisServer.invoke (AxisServer.java:281)
         at org.apache.axis.transport.http.AxisServlet.doPost (AxisServlet.java:699)
         at javax.servlet.http.HttpServlet.service (HttpServlet.java:709)
         at org.apache.axis.transport.http.AxisServletBase.service (AxisServletBase.java:327)
         at javax.servlet.http.HttpServlet.service (HttpServlet.java:802)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:252)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:173)
         à com.companyname.mtix.sms.http.filters.NoCacheFilter.doFilter (NoCacheFilter.java:63)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:202)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:173)
         à com.companyname.mtix.sms.http.filters.MessageFilter.doFilter (MessageFilter.java:53)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:202)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:173)
         at org.springframework.web.filter.RequestContextFilter.doFilterInternal (RequestContextFilter.java:61)
         at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:77)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:202)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:173)
         à org.ajaxanywhere.AAFilter.doFilter (AAFilter.java:46)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:202)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:173)
         at org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:213)
         at org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:178)
         at org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:126)
         at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:105)
         at org.apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.java:541)
         at org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:107)
         at org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:148)
         at org.apache.coyote.http11.Http11Processor.process (Http11Processor.java:869)
         at org.apache.coyote.http11.Http11BaseProtocol $ Http11ConnectionHandler.processConnection (Http11BaseProtocol.java:664)
         at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket (PoolTcpEndpoint.java:527)
         at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt (LeaderFollowerWorkerThread.java:80)
         at org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run (ThreadPool.java:684)
         à java.lang.Thread.run (Thread.java:595)
    

modifier

La ligne de notre code sur laquelle l’exception est lancée est la dernière ligne de l’extrait de code ci-dessous.

 Ssortingng aggregatorResponse = null; HttpClient httpClient = prepareHttpClient( username, password ); PostMethod postMethod = preparePostMethod( textUrl ); try { SybaseTextMessageBuilder builder = new SybaseTextMessageBuilder(); URL notifyUrl = buildNotificationUrl( textMessage, codeSetManager ); Ssortingng smsRequestDocument = builder.buildTextMessage( textMessage, notifyUrl ); LOG.debug( "Sybase MT document created as: \n" + smsRequestDocument ); postMethod.setRequestEntity( new SsortingngRequestEntity( smsRequestDocument ) ); LOG.debug( "commiting SMS to aggregator: " + textMessage.toSsortingng() ); int httpStatus = httpClient.executeMethod( postMethod ); 

Le javadoc pour SocketException indique qu’il est

Émis pour indiquer qu’il existe une erreur dans le protocole sous-jacent, telle qu’une erreur TCP

Dans votre cas, il semble que la connexion ait été fermée par la fin du serveur. Cela peut être un problème avec la demande que vous envoyez ou un problème à leur fin.

Pour faciliter le débogage, vous pouvez utiliser un outil tel que Wireshark pour afficher les paquets réseau réels. En outre, existe-t-il un client alternatif à votre code Java que vous pouvez utiliser pour tester le service Web? Si cela réussissait, cela pourrait indiquer un bogue dans le code Java.

En utilisant le client HTTP Commons, consultez le Guide de journalisation du client HTTP commun . Cela vous indiquera comment enregistrer la demande au niveau HTTP.

Cette erreur se produit de votre côté et pas de l’autre côté. Si l’autre côté réinitialise la connexion, le message d’exception doit indiquer:

 java.net.SocketException reset by peer 

La cause est que la connexion à l’intérieur de HttpClient est HttpClient . Vérifiez que la connexion obsolète pour SSL ne corrige pas cette erreur. Solution: vider votre client et recréer.

Si vous tentez d’accéder à des services Web déployés sur un serveur Glassfish3, vous souhaiterez peut-être optimiser vos parameters de pool de threads HTTP. Cela a corrigé les exceptions SocketEx que nous avions lorsque plusieurs threads simultanés appelaient le service Web.

  1. Aller à la console d’administration
  2. Naviguez vers “Configurations” -> “Config serveur” -> “Pools de threads” -> “http-thread-pool”.
  3. Modifier le paramètre “Max Thread Pool Size” de 5 à 32
  4. Modifier le paramètre “Taille minimale du pool de threads” de 2 à 16
  5. Redémarrez Glassfish.

Dans mon cas, c’était parce que mon Tomcat était défini avec un maxHttpHeaderSize insuffisant pour une requête SOLR particulièrement compliquée.

J’espère que cela aide quelqu’un là-bas!

J’ai également trébuché sur cette erreur. Dans mon cas, le problème était que j’utilisais JRE6, avec le support de TLS1.0 . Le serveur ne supportant que TLS1.2, cette erreur a été générée.

Je reçois cette erreur tout le temps et je le considère comme normal.

Cela se produit quand un côté essaie de lire quand l’autre partie a déjà raccroché. Ainsi, selon le protocole, cela peut désigner ou non un problème . Si mon code client indique spécifiquement au serveur qu’il va raccrocher, le client et le serveur peuvent raccrocher en même temps et ce message ne se produira pas.

La façon dont j’implémente mon code est que le client raccroche simplement sans dire au revoir. Le serveur peut alors détecter l’erreur et l’ignorer. Dans le contexte de HTTP, je crois qu’un niveau du protocole permet plus d’une demande par connexion, tandis que l’autre ne le fait pas.

Ainsi, vous pouvez voir comment un côté pourrait continuer à accrocher de l’autre. Je doute que l’erreur que vous recevez soit préoccupante et que vous puissiez simplement l’empêcher de le remplir.

L’exception signifie que le socket a été fermé de manière inattendue de l’autre côté. Comme vous appelez un service Web, cela ne devrait pas se produire – vous envoyez probablement une demande qui déclenche un bogue dans le service Web.

Essayez de consigner toute la demande dans ces cas et voyez si vous remarquez quelque chose d’inhabituel. Sinon, contactez le fournisseur de services Web et envoyez-lui votre demande problématique consignée.

Cette erreur se produit côté serveur lorsque le client a fermé la connexion de socket avant que la réponse puisse être renvoyée via le socket. Dans un scénario d’application Web, tous ces éléments ne sont pas dangereux, car ils peuvent être créés manuellement. Par exemple, en quittant le navigateur avant que la réponse ne soit récupérée.

Je sais que ce sujet est un peu ancien, mais j’aimerais append mes 2 cents. Nous avons eu la même erreur de “réinitialisation de la connexion” juste après l’une des versions.

La cause principale était que notre serveur apache était prêt pour le déploiement. Tout notre trafic tiers se fait par apache et nous recevons une erreur de réinitialisation de la connexion en raison de son arrêt.

Je recevais exactement cette erreur aussi: Connection reset by peer . L’exception a été soulevée par le modèle REST de Spring lors de l’exécution de la méthode postForObject() . Pour moi, le problème était une requête URL HTTP trop longue. Donc, vérifiez d’abord si l’URL produite est ce qu’elle devrait être et, si votre serveur doit vraiment être capable de gérer les requêtes de cette longueur, allez simplement dans la configuration du serveur et augmentez la longueur autorisée par défaut des requêtes d’URL.

Cela a résolu le problème pour moi, mais soyez conscient que l’application peut ne pas fonctionner sur certains navigateurs Internet, en particulier les anciens, car ils ont une longueur maximale de requêtes d’URL.

J’espère que cela aide…

J’ai eu cette erreur lorsque le fichier texte que j’essayais de lire contenait une chaîne correspondant à une signature antivirus sur notre pare-feu.

J’ai rencontré ce problème. Il est causé par les sessions verrouillées dans la firebase database liées aux tables que vous allez modifier via Webservice.

Recherchez les identifiants de session verrouillés:

 select * from v$lock l , all_objects a where l.TYPE ='TM' and l.id1 = a.OBJECT_ID; 

Cela devrait vous donner des indices sur la table qui est verrouillée, mais ne pas encore terminer la modification.

Ensuite, supprimez-le dans la v$session :

 select * from v$session where sid = 99; 

( 99 par exemple.)