Что вызывает у меня исключение java.net.SocketException: сброс подключения?
Мы видим частые, но прерывистые 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.HttpMethod Base.readStatusLine(HttpMethod base.java:1832)
в org.apache.commons.httpclient.HttpMethod Base.readResponse(HttpMethod base.java: 1590)
в org.apache.commons.httpclient.HttpMethod Base.execute(HttpMethod base.java: 995)
в org.apache.commons.httpclient.HttpMethod Director.executeWithRetry(HttpMethod Director.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.Сгенерированный methodaccessor203.invoke (неизвестный источник)
в sun.reflect.Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:25)
в java.lang.reflect.Метод.invoke(Метод.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.Стратегия вызова.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.processssocket(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)
Наш компонент представляет собой веб-приложение, работающее под управлением Tomcat, которое вызывает сторонний веб-сервис, который отправляет SMS-сообщения, так получилось. Строка нашего кода, из которой генерируется исключение, является последней строкой в приведенном ниже фрагменте кода.
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 );
Переведено автоматически
Ответ 1
В javadoc для исключения SocketException указано, что это
Выдается, чтобы указать, что в базовом протоколе есть ошибка, такая как ошибка TCP
В вашем случае кажется, что соединение было закрыто сервером, на стороне которого установлено соединение. Это может быть проблема с отправляемым вами запросом или проблема на их конце.
Чтобы облегчить отладку, вы могли бы рассмотреть возможность использования такого инструмента, как Wireshark, для просмотра фактических сетевых пакетов. Кроме того, существует ли альтернативный клиент для вашего Java-кода, который вы могли бы использовать для тестирования веб-службы? Если это было успешно, это может указывать на ошибку в Java-коде.
Поскольку вы используете HTTP-клиент Commons, ознакомьтесь с Руководством по протоколированию обычных HTTP-клиентов. В нем рассказывается, как протоколировать запрос на уровне HTTP.
Ответ 2
Эта ошибка происходит на вашей стороне, а не на другой стороне. Если другая сторона сбросит соединение, то в сообщении об исключении должно быть написано:
java.net.SocketException reset by peer
Причина в том, что внутреннее соединение HttpClient
устарело. Проверка устаревшего соединения на наличие SSL не устраняет эту ошибку. Решение: сбросить ваш клиент и создать заново.
Ответ 3
Если вы столкнулись с этим при попытке доступа к веб-службам, развернутым на сервере Glassfish3, возможно, вам захочется настроить настройки пула http-потоков. Это исправило исключения SocketException, которые у нас возникали, когда множество параллельных потоков вызывали веб-службу.
- Перейдите в консоль администратора
- Перейдите в "Конфигурации" -> "Конфигурация сервера"-> "Пулы потоков"-> "http-thread-pool".
- Измените параметр "Максимальный размер пула потоков" с 5 на 32
- Измените параметр "Минимальный размер пула потоков" с 2 на 16
- Перезапустите Glassfish.
Ответ 4
Я также наткнулся на эту ошибку. В моем случае проблема заключалась в том, что я использовал JRE6 с поддержкой TLS1.0. Сервер поддерживал только TLS1.2, поэтому была выдана эта ошибка.