Ce qui cause mon java.net.SocketException: réinitialisation de la connexion?

nous voyons fréquemment des erreurs 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 fonctionne 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 savons pas d'où vient l'erreur Connection reset , ni comment procéder au débogage.

le problème apparaît être complètement intermittent, et sans rapport avec les messages que nous tentons d'envoyer.

toute suggestion sur les causes typiques de cette exception et sur la façon dont nous pourrions procéder est la bienvenue.

la pile d'appels complète est incluse ci-dessous.

( 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)
    

Modifier

la ligne de notre code sur laquelle l'exception obtient jetés sont la dernière ligne dans le code snippet 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 );
120
demandé sur S.A.Norton Stanley 2009-02-25 14:07:06

13 réponses

le javadoc pour SocketException indique qu'il est

lancé pour indiquer qu'il y a 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 l'extrémité serveur de la connexion. Cela pourrait être un problème avec la demande que vous envoyez ou une question à leur fin.

pour faciliter le débogage, vous pouvez regarder en utilisant un outil tel que: Wireshark pour voir les paquets réseau actuels. En outre, y a-t-il un client alternatif à votre code Java que vous pourriez utiliser pour tester le service web? Si cela réussissait, cela pourrait indiquer un bug dans le code Java.

comme vous utilisez le Client HTTP Commons, consultez le Common HTTP Client Logging Guide . Cela vous indiquera comment enregistrer la requête au niveau HTTP.

57
répondu Mark 2009-02-25 11:30:57

cette erreur se produit de votre côté et non de l'autre côté. Si l'autre côté a réinitialisé la connexion, alors le message d'exception devrait dire:

java.net.SocketException reset by peer

La cause est la connexion à l'intérieur HttpClient est obsolète. Vérifier la connexion viciée pour voir si SSL ne corrige pas cette erreur. Solution: videz votre client et recréez.

31
répondu Nathan 2017-11-27 17:22:24

si vous éprouvez cette tentative d'accéder à des services web déployés sur un serveur Glassfish3, vous voudrez peut-être ajuster vos paramètres http-thread-pool. Cette socketexceptions fixe que nous avions lorsque de nombreux threads concurrents appelaient le service web.

  1. Aller à l'admin console
  2. Naviguer vers "Configurations"->"configuration du Serveur"->"pools de Threads"->"http thread pool".
  3. changement de paramètre "Taille Max Thread Pool" de 5 à 32
  4. changement de réglage "min Thread Pool Size" de 2 à 16
  5. Redémarrez Glassfish.
16
répondu PålOliver 2011-10-21 10:41:23

dans mon cas, c'était parce que mon Tomcat était réglé avec un maxHttpHeaderSize insuffisant pour une requête SOLR particulièrement compliquée.

Espérons que cela aide quelqu'un là-bas!

7
répondu inanutshellus 2013-01-22 19:17:05

j'ai aussi trébuché sur cette erreur. Dans mon cas, le problème était que j'utilisais JRE6, avec un support pour TLS1.0 . Le serveur ne supporte que TLS1.2, Ainsi cette erreur a été jetée.

7
répondu Jacob van Lingen 2017-05-23 12:18:03

je reçois cette erreur tout le temps et considère qu'elle est normale.

cela se produit quand une partie essaie de lire alors que l'autre partie a déjà raccroché. Ainsi selon le protocole cela peut ou non désigner 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 n'arrivera pas.

La façon dont je le mettre en œuvre mon code est que le client raccroche sans dire au revoir. Le serveur peut alors attraper 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.

Donc vous pouvez voir comment potentiellement un côté pourrait garder accroché sur l'autre. Je doute que l'erreur que vous recevez soit d'une quelconque préoccupation piratique et vous pourriez simplement l'attraper pour l'empêcher de remplir vos fichiers journaux.

5
répondu Gorge 2012-12-19 00:12:15

L'Exception signifie que la douille a été fermée inopinément de l'autre côté. Puisque vous appelez un service web, cela ne devrait pas se produire - très probablement vous envoyez une demande qui déclenche un bogue dans le service web.

essayez d'enregistrer toute la requête 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.

4
répondu Michael Borgwardt 2009-02-25 11:23:53

cette erreur se produit du côté du serveur lorsque le client ferme la connexion socket avant que la réponse puisse être retournée sur la socket. Dans un scénario d'application web, tous 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.

4
répondu Paul 2009-02-25 11:35:41

je sais que ce fil est un peu vieux, mais je voudrais ajouter mes 2 cents. Nous avons eu le même "connexion réinitialisée" erreur juste après notre l'une des versions.

la cause fondamentale était, notre serveur apache a été ramené pour le déploiement. Tout notre trafic tiers passe par apache et nous faisions une erreur de réinitialisation de connexion à cause de cela.

1
répondu Nirmal Mangal 2016-09-14 14:26:16

c'est un vieux fil, mais je suis tombé sur java.net.SocketException: Connection reset hier.

l'application côté serveur a vu ses paramètres de restriction modifiés pour ne permettre 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 de limitation.

1
répondu S Jade 2018-10-05 03:21:13

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

Qui a résolu le problème pour moi, mais soyez conscient: l'application pourrait ne pas fonctionner sur certains navigateurs internet, en particulier les anciens, car ils ont fixé la longueur maximale des requêtes URL.

J'espère que ça aidera...

0
répondu Roquen 2012-03-08 14:32:33

j'ai eu cette erreur quand le fichier texte que j'essayais de lire contenait une chaîne qui correspondait à une signature antivirus sur notre pare-feu.

0
répondu Noumenon 2017-11-05 20:31:07

j'ai rencontré ce problème. Il est causé par les sessions verrouillées dans la base de données qui se rapportent aux tables que vous allez modifier via Webservice.

trouver les ID 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 pas encore terminer la modification.

puis supprimer dans le v$session :

select * from v$session where sid = 99;

( 99 pour exemple.)

-5
répondu Bruce Yo 2016-09-25 10:36:28