Spring-WS и «Ошибка при попытке сохранить SOAPPart» - PullRequest
2 голосов
/ 11 ноября 2011

У меня есть несколько веб-сервисов на сервере Weblogic 10. Каждый из них является частью большой системы. Работая локально и в нашей среде qa, система работает безупречно, отвечает быстро и, как и ожидалось. Все выглядит хорошо.

Прежде чем приступить к производству, мы собираемся провести стресс-тестирование системы, чтобы увидеть, какую нагрузку мы можем иметь, прежде чем время отклика станет большим. При тестировании веб-служб (например, с использованием внешнего интерфейса или SOAPUI) мы сталкиваемся с определенной нагрузкой (например, со многими ответами в секунду или чем-то в этом роде, я не уверен, что именно приводит к сбою системы), мы получаем ошибку, указанную ниже. Я понятия не имею, почему. Через несколько секунд система снова отвечает безупречно, поэтому я предполагаю, что это как-то связано с количеством запросов ...

Любые идеи или советы очень ценятся! Я заблудился здесь, поэтому, пожалуйста - все поможет.

Мы работаем: Weblogic 10.3.2, Spring 2.5.6 (по архитектурным причинам мы не можем обновить), Spring-WS 1.5.9 (по архитектурным причинам мы не можем обновить) и Stripes 1.5.4

<11-11-2011 08:43:58 CET> <Error> <HTTP> <BEA-101017> <[ServletContext@11242741[app:salesoverview-ws-web module:salesoverview-ws-web path:/salesoverview-ws-web spec-version:2.5], request: weblogic.servlet.internal.ServletRequestImpl@1fbbfc5[POST /salesoverview-ws-web/services HTTP/1.1 Accept-Encoding: gzip,deflate Content-Type: text/xml;charset=UTF-8 SOAPAction: "" User-Agent: Jakarta Commons-HttpClient/3.1 Content-Length: 425]] Root cause of ServletException.
org.springframework.ws.soap.saaj.SaajSoapMessageException: Could not write message to OutputStream: Error attempting to save SOAPPart. java.io.IOException: java.net.SocketException: Software caused connection abort: socket write error; nested exception is javax.xml.soap.SOAPException: Error attempting to save SOAPPart. java.io.IOException: java.net.SocketException: Software caused connection abort: socket write error
        at org.springframework.ws.soap.saaj.SaajSoapMessage.writeTo(SaajSoapMessage.java:169)
        at org.springframework.ws.transport.AbstractWebServiceConnection.send(AbstractWebServiceConnection.java:45)
        at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:97)
        at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:57)
        at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:230)
        Truncated. see log file for complete stacktrace

Caused By: javax.xml.soap.SOAPException: Error attempting to save SOAPPart. java.io.IOException: java.net.SocketException: Software caused connection abort: socket write error
        at weblogic.xml.saaj.SOAPMessageImpl.SOAPPart_writeTo(SOAPMessageImpl.java:1011)
        at weblogic.xml.saaj.SOAPMessageImpl.writeTo(SOAPMessageImpl.java:816)
        at org.springframework.ws.soap.saaj.Saaj13Implementation.writeTo(Saaj13Implementation.java:292)
        at org.springframework.ws.soap.saaj.SaajSoapMessage.writeTo(SaajSoapMessage.java:165)
        at org.springframework.ws.transport.AbstractWebServiceConnection.send(AbstractWebServiceConnection.java:45)
        Truncated. see log file for complete stacktrace
>

Копая BEA-101017, я нашел небольшую информацию об Dok от Weblogic error - хотя это мне не помогает:

Ошибка: [контекст] Коренная причина ServletException.

Описание: [context] Первопричина ServletException, которое веб Контейнер приложения обнаружен при обслуживании запроса.

Причина: контейнер веб-приложения обнаружил непредвиденное исключение.

Действие: проверьте исключение для точного сообщения об ошибке.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Предполагая, что веб-служба из вашего примера не имеет доступа к другим веб-службам (и, следовательно, приведенная выше трассировка соответствует вашей веб-службе , отправляющей ответ ):

Кажется, что ваш веб-сервис через SAAJ пытается выполнить запись в отключенный (или иначе недоступный) сокет. Обычной причиной этого является то, что клиент отключился во время ожидания ответа от сервера.

Я бы предложил:

  1. Убедитесь, что ваш клиент слишком долго ждал, прежде чем получил ответ, что могло привести к его отключению.

  2. Проверьте, не возникают ли в операционной системе проблемы с распределением сокетов. Используйте 'netstat' или другой инструмент мониторинга (например, TCPView в Windows), чтобы проверить, сколько открытых сокетов (большинство операционных систем устанавливают ограничения на количество сокетов, разрешенных для пользователя или для всего мира).

  3. Убедитесь, что во время ваших тестов абсолютно отсутствуют сетевые ошибки (не должно быть так, если вы тестируете на localhost, но в противном случае вам нужно убедиться, что сетевые устройства (маршрутизаторы, коммутаторы, другие компьютеры) не сбрасываются. соединения или пакеты. Возможно, это происходит при высокой загрузке трафика.

  4. Убедитесь, что у вас нет конфликтов потоков, которые могут привести к тому, что ваш веб-сервис будет использовать или закрывать сокеты других запросов (это будет редкая ситуация, особенно если вы используете Spring).

  5. Проверьте эту ветку Официальные причины "Прерывание соединения из-за программного обеспечения: ошибка записи в сокет" и другие возможные причины "Прерывание соединения из-за программного обеспечения" (обратите внимание, что проблема может быть связана с вашим приложением) сервер и операционная система).

Надеюсь, это поможет.

0 голосов
/ 18 ноября 2011

После большой отладки я обнаружил, что проблема возникла из-за проблем DB2 - мы попали в угол нашей базы данных, что вызвало переполнение внутреннего стека, которое затем переместилось к Dao и далее к SOAP-части (толькоего труднее обнаружить из-за шаблонов Spring JDBC в Dao).

Короче говоря, проблема была неперехваченным исключением, которое в Spring-WS привело к возникновению исключения SaajSoapMessageException.Подсказка пришла от «Программное обеспечение вызвало прерывание соединения: ошибка записи в сокет», но произошло на стороне WS (не клиент и не связь между клиентом / сервером).

Подсказка: окружите вашу базу данных с помощью try / catch и catch Exception, чтобы можно было точно найти выброшенное исключение.В моем случае это вызвало исключение DB2 ("SQLCode -1218"), и это обычно используется, когда у вас заканчиваются ресурсы (например, соединения с источниками данных).В моем случае это был SQL, который DB2 не любил - и действительно не любил под нагрузкой.Я не могу это объяснить, но это связано с собственными внутренними ресурсами DB2 - ага, пойди разберись!:)

Спасибо, jjmontes, за подсказки и указатели, но в данном случае это не было проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...