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 .

5voto

Paul Points 144

Cette erreur se produit du côté du serveur lorsque le client a fermé la connexion au socket avant que la réponse ne puisse être renvoyée par le socket. Dans un scénario d'application web, toutes ces erreurs ne sont pas dangereuses, car elles peuvent être créées manuellement. Par exemple, en quittant le navigateur avant que la réponse ne soit récupérée.

5voto

Gorge Points 11

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

Cela se produit lorsqu'un côté essaie de lire alors que l'autre côté a déjà raccroché. Ainsi selon le protocole, cela peut ou non constituer un problème. . Si mon code client indique spécifiquement au serveur qu'il va raccrocher, alors 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 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 requête par connexion, alors que l'autre ne le permet pas.

Vous pouvez donc voir comment un côté peut potentiellement continuer à s'accrocher à l'autre. Je doute que l'erreur que vous recevez soit un problème de piratage et vous pourriez simplement l'attraper pour éviter qu'elle ne remplisse vos fichiers journaux.

2voto

Michael Borgwardt Points 181658

L'exception signifie que la prise a été fermée de manière inattendue de l'autre côté. Comme vous appelez un service Web, cela ne devrait pas se produire - il est fort probable que vous envoyiez une requête qui déclenche un bogue dans le service Web.

Essayez d'enregistrer l'intégralité de la demande dans ces cas-là et voyez si vous remarquez quelque chose d'inhabituel. Sinon, prenez contact avec le fournisseur de services Web et envoyez-lui la requête problématique enregistrée.

5 votes

Non, ce n'est pas le cas. C'est plutôt "connexion réinitialisée par un pair".

1voto

Yellow Diamond Points 121

Je sais que ce fil de discussion est un peu vieux, mais j'aimerais ajouter mes deux cents. Nous avons eu la même erreur de "réinitialisation de la connexion" juste après l'une des versions.

La cause profonde était, notre apache a été mis hors service pour être déployé. Tout notre trafic tiers passe par apache et on a eu une erreur de réinitialisation de la connexion parce qu'il était hors service.

1voto

S Jade Points 470

Il s'agit d'un vieux fil de discussion, mais je suis tombé sur java.net.SocketException: Connection reset hier.

Les paramètres d'étranglement de l'application côté serveur ont été modifiés pour n'autoriser qu'une seule connexion à la fois ! Ainsi, les appels passaient parfois et parfois pas. J'ai résolu le problème en modifiant les paramètres d'étranglement.

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