151 votes

Quelle est la cause de mon java.net.SocketException : Réinitialisation de la connexion ?

Nous constatons de fréquentes mais intermittentes java.net.SocketException: Connection reset erreurs dans nos journaux. Nous ne sommes pas certains de l'endroit où le Connection reset L'origine de l'erreur et la manière de la déboguer.

Le problème semble ne pas être lié aux messages que nous tentons d'envoyer. Notez que le message est pas connection reset by peer .

Avez-vous des suggestions sur les causes typiques de cette exception et sur la manière de procéder ?

Voici une trace de pile représentative ( com.companyname.mtix.sms est notre composant) :

    java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at 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)
        at 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(Unknown Source)
        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)
        at 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)
        at 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)
        at 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)
        at 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)
        at java.lang.Thread.run(Thread.java:595)

Notre composant est une application web, fonctionnant sous Tomcat, qui appelle un service web tiers qui envoie des messages SMS, il se trouve que c'est le cas. La ligne de notre code sur laquelle l'exception est levée est la dernière ligne de l'extrait de code ci-dessous.

String aggregatorResponse = null;
HttpClient httpClient = prepareHttpClient( username, password );
PostMethod postMethod = preparePostMethod( textUrl );

try {
  SybaseTextMessageBuilder builder = new SybaseTextMessageBuilder();
  URL notifyUrl = buildNotificationUrl( textMessage, codeSetManager );
  String smsRequestDocument = builder.buildTextMessage( textMessage, notifyUrl );
  LOG.debug( "Sybase MT document created as: \n" + smsRequestDocument );

  postMethod.setRequestEntity( new StringRequestEntity( smsRequestDocument ) );
  LOG.debug( "commiting SMS to aggregator: " + textMessage.toString() );
  int httpStatus = httpClient.executeMethod( postMethod );

2 votes

Comme vous le voyez dans la pile complète, cela commence par read opération . Votre client est parti mais vous essayez de lire à partir de son flux. Voir ma solution ServerSocket stackoverflow.com/a/31741436/413032 .

67voto

Mark Points 14208

La javadoc de SocketException indique qu'il s'agit de

Lancé pour indiquer qu'il y a une erreur dans le protocole sous-jacent, comme une erreur TCP.

Dans votre cas, il semble que la connexion ait été fermée par l'extrémité serveur de la connexion. Il peut s'agir d'un problème lié à la requête que vous envoyez ou d'un problème au niveau du serveur.

Pour faciliter le débogage, vous pouvez envisager d'utiliser un outil tel que Wireshark pour voir les paquets réseau réels. Par ailleurs, existe-t-il un client alternatif à votre code Java que vous pourriez utiliser pour tester le service Web ? Si cela a réussi, cela pourrait indiquer un bogue dans le code Java.

Comme vous utilisez le client HTTP de Commons, jetez un coup d'œil à l'adresse suivante Guide de journalisation du client HTTP commun . Cela vous indiquera comment enregistrer la requête au niveau HTTP.

5 votes

Je ne pense pas que la réinitialisation de la connexion signifie que le serveur a fermé la connexion (en envoyant un drapeau FYN). Je pense que cela signifie qu'il ne répond plus aux drapeaux ACK, ou qu'il ne répond pas par TCP/IP). Si le drapeau FYN a été envoyé, ou plutôt si le serveur a fermé la connexion, vous obtiendrez simplement -1 à partir de read(), et une EOFException. Quand je serai chez moi, j'ai l'intention de le confirmer dans les deux cas.

2 votes

En réponse au commentaire de Zombies, quelqu'un a-t-il jamais trouvé si la réinitialisation de la connexion signifie que le serveur a fermé la connexion ?

3 votes

D'après mon expérience d'un problème similaire dans le passé, la cause était une mauvaise connexion réseau du côté du serveur qui provoque un dépassement du nombre de connexions. Le problème avec le timeout d'un Socket est que son comportement par défaut est de ne pas dépasser le timeout (timeout infini). (Suite)

52voto

Cette erreur se passe de votre côté et PAS de l'autre côté. Si l'autre côté a réinitialisé la connexion, le message d'exception devrait dire :

java.net.SocketException reset by peer

La cause est la connexion à l'intérieur HttpClient est périmée. Vérifier la connexion périmée pour SSL ne résout pas cette erreur. Solution : videz votre client et recréez-le.

18voto

PålOliver Points 750

Si vous rencontrez ce problème en essayant d'accéder à des services Web déployés sur un serveur Glassfish3, il se peut que vous souhaitiez ajuster les paramètres de votre pool de threads http. Cela a permis de corriger les SocketExceptions que nous avions lorsque plusieurs threads concurrents appelaient le service Web.

  1. Allez dans la console d'administration
  2. Naviguez vers "Configurations"->"Server config"->"Thread pools"->"http-thread-pool".
  3. Modifier le paramètre "Taille maximale du pool de threads" de 5 à 32
  4. Changez le paramètre "Min Thread Pool Size" de 2 à 16
  5. Redémarrez Glassfish.

0 votes

Cela m'a aidé sur Glassfish 4 également

12voto

Jacob van Lingen Points 933

Je suis également tombé sur cette erreur. Dans mon cas, le problème était que j'utilisais JRE6, avec la prise en charge de TLS1.0 . Le serveur ne supportant que TLS1.2, cette erreur a été déclenchée.

9voto

Gabriel Points 1565

Dans mon cas, c'était parce que mon Tomcat était configuré avec une valeur insuffisante de maxHttpHeaderSize pour une requête SOLR particulièrement compliquée.

J'espère que cela aidera quelqu'un d'autre !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X