我们在日志中看到频繁但间歇性 java.net.SocketException: Connection reset
的错误。我们不确定Connection reset
错误实际上来自哪里,以及如何进行调试。
该问题似乎与我们尝试发送的消息无关。请注意,该消息不是 connection reset by peer
.
有关此异常的典型原因可能是什么以及我们如何进行的任何建议?
这是一个有代表性的堆栈跟踪(com.companyname.mtix.sms
是我们的组件):
java.net.SocketException:连接重置 在 java.net.SocketInputStream.read(SocketInputStream.java:168) 在 java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 在 java.io.BufferedInputStream.read(BufferedInputStream.java:235) 在 org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:77) 在 org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:105) 在 org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1115) 在 org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1832) 在 org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1590) 在 org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:995) 在 org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397) 在 org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170) 在 org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396) 在 org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324) 在 com.companyname.mtix.sms.services.impl.message.SendTextMessage.sendTextMessage(SendTextMessage.java:127) 在 com.companyname.mtix.sms.services.MessageServiceImpl.sendTextMessage(MessageServiceImpl.java:125) 在 com.companyname.mtix.sms.services.remote.MessageServiceRemoteImpl.sendTextMessage(MessageServiceRemoteImpl.java:43) 在 sun.reflect.GeneratedMethodAccessor203.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:585) 在 org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397) 在 org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186) 在 org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323) 在 org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32) 在 org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118) 在 org.apache.axis.SimpleChain.invoke(SimpleChain.java:83) 在 org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:453) 在 org.apache.axis.server.AxisServer.invoke(AxisServer.java:281) 在 org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:709) 在 org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) 在 com.companyname.mtix.sms.http.filters.NoCacheFilter.doFilter(NoCacheFilter.java:63) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) 在 com.companyname.mtix.sms.http.filters.MessageFilter.doFilter(MessageFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:61) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) 在 org.ajaxanywhere.AAFilter.doFilter(AAFilter.java:46) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) 在 org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) 在 org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) 在 org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) 在 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) 在 java.lang.Thread.run(Thread.java:595)
我们的组件是一个 Web 应用程序,在 Tomcat 下运行,它调用发送 SMS 消息的第三方 Web 服务,它就是这样发生的。引发异常的代码行是下面代码片段的最后一行。
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 );