Wat veroorzaakt mijn java.net.SocketException: verbinding opnieuw ingesteld?

We zien frequente maar intermitterende java.net.SocketException: Connection reset-fouten in onze logbestanden. We weten niet zeker waar de fout Connection resetvandaan komt en hoe we foutopsporing moeten aanpakken.

Het probleem lijkt niets te maken te hebben met de berichten die we proberen te verzenden.
Merk op dat het bericht nietconnection reset by peeris.

Enige suggesties over wat de typische oorzaken van deze uitzondering kunnen zijn en hoe we verder kunnen gaan?

Hier is een representatieve stacktracering (com.companyname.mtix.smsis onze component):

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

Ons onderdeel is een webtoepassing die draait onder Tomcat en die een externe webservice aanroept die sms-berichten verstuurt. De regel van onze code waarop de uitzondering wordt gegenereerd, is de laatste regel in het onderstaande codefragment.

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

Antwoord 1, autoriteit 100%

De javadoc voor SocketException stelt dat het is

Gegooid om aan te geven dat er een fout in het onderliggende protocol zit, zoals een TCP-fout

In uw geval lijkt het erop dat de verbinding is verbroken aan de serverzijde van de verbinding. Dit kan een probleem zijn met het verzoek dat u verzendt of een probleem aan het einde ervan.

Als hulp bij het debuggen kun je een tool gebruiken zoals Wiresharkom de daadwerkelijke netwerkpakketten te bekijken. Is er ook een alternatieve client voor uw Java-code die u zou kunnen gebruiken om de webservice te testen? Als dit gelukt is, kan dit duiden op een bug in de Java-code.

Als je Commons HTTP Client gebruikt, kijk dan eens naar de Common HTTP Client Logging Gids. Dit zal u vertellen hoe u het verzoek op HTTP-niveau kunt loggen.


Antwoord 2, autoriteit 73%

Deze fout gebeurt aan uw kanten NIET aan de andere kant. Als de andere kant de verbinding reset, dan zou het uitzonderingsbericht moeten zeggen:

java.net.SocketException reset by peer

De oorzaak is dat de verbinding binnen HttpClientniet meer werkt. Controleer of een verouderde verbinding voor SSL deze fout niet oplost. Oplossing: dump je client en maak opnieuw.


Antwoord 3, autoriteit 27%

Als u dit ervaart bij het proberen toegang te krijgen tot webservices die zijn geïmplementeerd op een Glassfish3-server, wilt u misschien uw http-thread-pool-instellingen aanpassen. Die vaste SocketExceptions die we hadden toen veel gelijktijdige threads de webservice aanriepen.

  1. Ga naar de beheerdersconsole
  2. Navigeer naar “Configuraties”->”Serverconfiguratie”->”Thread pools”->”http-thread-pool”.
  3. Instelling “Max. draadpoolgrootte” wijzigen van 5 in 32
  4. Verander de instelling “Min Thread Pool Size” van 2 naar 16
  5. Herstart Glassfish.

Antwoord 4, autoriteit 19%

Ik kwam deze fout ook tegen. In mijn geval was het probleem dat ik JRE6 gebruikte, met ondersteuning voor TLS1.0. De server ondersteunde alleen TLS1.2, dus deze fout is opgetreden.


Antwoord 5, autoriteit 11%

In mijn geval was dit omdat mijn Tomcat was ingesteld met een onvoldoende maxHttpHeaderSizevoor een bijzonder gecompliceerde SOLR-query.

Ik hoop dat dit iemand helpt!


Antwoord 6, autoriteit 8%

Ik krijg deze foutmelding de hele tijd en beschouw het als normaal.

Het gebeurt wanneer de ene kant probeert te lezen terwijl de andere kant al heeft opgehangen. Dus afhankelijk van het protocol kan dit al dan niet duiden op een probleem.
Als mijn clientcode specifiek aangeeft aan de server dat deze gaat ophangen, dan kunnen zowel client als server tegelijkertijd ophangen en zal dit bericht niet verschijnen.

De manier waarop ik mijn code implementeer, is dat de klant gewoon ophangt zonder afscheid te nemen.
De server kan de fout dan opvangen en negeren. In de context van HTTP geloof ik dat het ene niveau van het protocol meer dan één verzoek per verbinding toestaat en het andere niet.

Zo kun je zien hoe de ene kant mogelijk aan de andere kant blijft hangen. Ik betwijfel of de fout die je ontvangt van piraterij is en je kunt hem gewoon opvangen om te voorkomen dat hij je logbestanden vult.


Antwoord 7, autoriteit 6%

Deze fout treedt op aan de serverzijde wanneer de client de socketverbinding heeft gesloten voordat het antwoord via de socket kon worden geretourneerd. In een web-app-scenario zijn deze niet allemaal gevaarlijk, omdat ze handmatig kunnen worden gemaakt. Bijvoorbeeld door de browser af te sluiten voordat het antwoord werd opgehaald.


Antwoord 8, autoriteit 3%

De uitzondering betekent dat de socket onverwachts van de andere kant werd gesloten. Aangezien u een webservice aanroept, zou dit niet moeten gebeuren – hoogstwaarschijnlijk verzendt u een verzoek dat een bug in de webservice veroorzaakt.

Probeer in die gevallen het volledige verzoek te loggen en kijk of u iets ongewoons opmerkt. Neem anders contact op met de webserviceprovider en stuur hen uw geregistreerde problematische verzoek.


Antwoord 9, autoriteit 2%

Ik weet dat deze thread een beetje oud is, maar ik wil graag mijn 2 cent toevoegen.
We hadden dezelfde “verbindingsreset” -fout direct na onze een van de releases.

De hoofdoorzaak was dat onze apache-server werd uitgeschakeld voor implementatie. Al ons verkeer van derden gaat via apacheen we kregen een verbindingsresetfout omdat deze niet werkte.


Antwoord 10, autoriteit 2%

Dit is een oude thread, maar ik kwam gisteren java.net.SocketException: Connection resettegen.

De server-side applicatie had de beperkingsinstellingen gewijzigd om slechts 1 verbinding tegelijk toe te staan! Dus soms gingen gesprekken door en soms niet. Ik heb het probleem opgelost door de beperkingsinstellingen te wijzigen.


Antwoord 11

Ik kreeg deze foutmelding toen het tekstbestand dat ik probeerde te lezen een tekenreeks bevatte die overeenkwam met een antivirushandtekening op onze firewall.


Antwoord 12

FWIW, ik kreeg deze foutmelding toen ik per ongeluk een GET-verzoek deed naar een eindpunt dat een POST-verzoek verwachtte. Vermoedelijk was dat precies die specifieke manier van servers om het probleem op te lossen.


Antwoord 13

Ik kreeg precies die fout ook: Connection reset by peer. De uitzondering werd veroorzaakt door de REST-sjabloon van Spring bij het uitvoeren van de methode postForObject(). Voor mij was het probleem een ​​te lang HTTP-URL-verzoek. Controleer dus eerst of de geproduceerde URL is wat hij zou moeten zijn en, als uw server echt verzoeken van die lengte zou moeten kunnen verwerken, ga dan gewoon naar de serverconfiguratie en verhoog de standaard toegestane lengte van URL-verzoeken.

Dat loste het probleem voor mij op, maar let op: de applicatie werkt mogelijk niet op sommige internetbrowsers, vooral oude, omdat ze een vaste maximale lengte van URL-verzoeken hebben.

Hopelijk helpt het…


Antwoord 14

Ik kreeg deze foutmelding omdat de poort waarmee ik verbinding probeerde te maken, gesloten was.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

eight + 10 =

Other episodes