In den Protokollen werden häufig, aber mit Unterbrechungen, die Fehler `java.net.SocketException: Connection reset"-Fehler in unseren Protokollen. Wir sind uns nicht sicher, woher der Fehler "Connection reset" tatsächlich kommt und wie wir die Fehlerbehebung angehen können.
Das Problem scheint in keinem Zusammenhang mit den Nachrichten zu stehen, die wir zu senden versuchen. Beachten Sie, dass die Nachricht nicht "Verbindungsreset durch Peer" lautet.
Haben Sie Vorschläge, was die typischen Ursachen für diese Ausnahme sein könnten und wie wir vorgehen könnten?
Hier ist ein repräsentativer Stack-Trace (com.companyname.mtix.sms
ist unsere Komponente):
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) </pre>
Bei unserer Komponente handelt es sich um eine Webanwendung, die unter Tomcat läuft und einen Webdienst eines Drittanbieters aufruft, der zufällig SMS-Nachrichten versendet. Die Zeile unseres Codes, in der die Ausnahme ausgelöst wird, ist die letzte Zeile im folgenden Codeausschnitt.
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 );
Die Javadoc für SocketException besagt, dass es sich um
Wird ausgelöst, um anzuzeigen, dass ein Fehler im zugrunde liegenden Protokoll vorliegt, z. B. ein TCP-Fehler
In Ihrem Fall scheint es, dass die Verbindung vom Server geschlossen wurde. Dies könnte ein Problem mit der von Ihnen gesendeten Anfrage oder ein Problem auf deren Seite sein.
Um die Fehlersuche zu erleichtern, könnten Sie ein Tool wie Wireshark verwenden, um sich die tatsächlichen Netzwerkpakete anzusehen. Gibt es außerdem einen alternativen Client zu Ihrem Java-Code, mit dem Sie den Webdienst testen könnten? Wenn dies erfolgreich war, könnte dies auf einen Fehler im Java-Code hindeuten.
Da Sie den Commons HTTP Client verwenden, werfen Sie einen Blick in den Common HTTP Client Logging Guide. Dort erfahren Sie, wie Sie die Anfrage auf HTTP-Ebene protokollieren können.
Dieser Fehler tritt auf der Serverseite auf, wenn der Client die Socket-Verbindung geschlossen hat, bevor die Antwort über den Socket zurückgegeben werden konnte. In einem Web-App-Szenario sind nicht alle diese Fehler gefährlich, da sie manuell erzeugt werden können. Zum Beispiel durch Beenden des Browsers, bevor die Antwort abgerufen wurde.
Die Exception bedeutet, dass der Socket von der anderen Seite unerwartet geschlossen wurde. Da Sie einen Webdienst aufrufen, sollte dies nicht passieren - höchstwahrscheinlich senden Sie eine Anfrage, die einen Fehler im Webdienst auslöst.
Versuchen Sie in solchen Fällen, die gesamte Anfrage zu protokollieren, und schauen Sie, ob Sie etwas Ungewöhnliches feststellen. Andernfalls setzen Sie sich mit dem Anbieter des Webdienstes in Verbindung und senden Sie ihm Ihre protokollierte problematische Anfrage.