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 );
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.
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.
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.
- Aller à l'admin console
- Naviguer vers "Configurations"->"configuration du Serveur"->"pools de Threads"->"http thread pool".
- changement de paramètre "Taille Max Thread Pool" de 5 à 32
- changement de réglage "min Thread Pool Size" de 2 à 16
- Redémarrez Glassfish.
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!
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.
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.
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.
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.
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.
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.
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...
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.
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.)