класса javax.в формате XML.с WS.WebServiceException: Ява.Ио.Класс IOException: ошибка при записи на сервер Tomcat 8
недавно мы обновили технический стек веб-сервиса JAX-WS, работающего на JRE 1.7.0_17/Tomcat7.0.39-JRE 1.8.0_66 / Tomcat 8.0.28. Веб-приложение работает в Windows Server 2012. Веб-служба использует реализацию Metro для JAX-WS. Клиенты работают в различных версиях windows, используя JRE 7 и API клиента JAX-WS, встроенный в JRE. Webservice используется для загрузки файлов с клиентских компьютеров в webservice, который сохраняет их в системе управления документами. Реализация работал почти безупречно под Java 7/в Tomcat 7, но мы столкнулись с проблемой больших нагрузок (2 Мб или больше), работающих под Java 8/котяра 8 сервере. Трассировка стека от клиента:
12/02/2015 14:12:38.699 [AWT-EventQueue-0] ERROR DocumentImporterMainWindow$SwingAction.importDocument: Unexpected Problem trying to call the CustomerOrderDMService
javax.xml.ws.WebServiceException: java.io.IOException: Error writing to server
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.readResponseCodeAndMessage(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.createResponsePacket(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(Unknown Source)
at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Unknown Source)
at com.sun.xml.internal.ws.client.Stub.process(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(Unknown Source)
at com.sun.proxy.$Proxy30.importDocument(Unknown Source)
at com.mycompany.documentimporter.DocumentImporterMainWindow$SwingAction.importDocument(DocumentImporterMainWindow.java:681)
at com.mycompany.documentimporter.DocumentImporterMainWindow$SwingAction.actionPerformed(DocumentImporterMainWindow.java:612)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.io.IOException: Error writing to server
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
... 54 more
к сожалению, ничего не регистрируется на стороне сервера в любом из журналов котяра. Я потратил несколько дней на поиски решения проблемы, но безуспешно. Я попытался отладить проблему с помощью различных способов, таких как ведение журнала клиентской стороны запроса/ответа SOAP и сервера сбоку с помощью
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
(заказчик) и
-Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true
(сервер) свойства системы java, но при возникновении ошибки регистрируется только запрос на стороне клиента:
---[HTTP request - http://localhost:8080/CustomerOrderDM/services/CustomerOrderDMService]---
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://www.mycompany.com/CustomerOrderDMService/ImportDocument"
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns3:ImportDocumentRequestDTO xmlns:ns3="http://www.mycompany.com/CustomerOrderDMService/" xmlns:ns2="http://www.mycompany.com/CustomerOrderDMService"><ns2:QuoteNumber>A000049</ns2:QuoteNumber><ns2:SerialNumber>STOCK</ns2:SerialNumber><ns2:DocumentType>Email</ns2:DocumentType><ns2:Description></ns2:Description><ns2:DocumentContents> **some base64 encoded byte[] of the file contents being uploaded**
Message has been truncated
use com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold property to increase the amount of printed part of the message
--------------------
поскольку регистрируется только запрос на стороне клиента, мы ожидаем, что сервер не полностью обрабатывает запрос, и он попадает в какой-то блок исключений, но без чего-либо входа в Файлы журнала сервера у нас возникают трудности с устранением проблемы.
мы пробовали использовать прокси, такие как мониторинг, встроенный в Eclipse, но еще раз я вижу только запрос от клиента и никакого ответа от сервера (когда клиент отправляет большие запросы, которые терпят неудачу, небольшие запросы регистрируют запрос/ответ как на клиенте, так и на сервере). Были бы весьма признательны за другие предложения по отладке.
мы также пробовали различные комбинации Java и Tomcat:
- Tomcat 7 / Java 7 = Работает
- Tomcat 7 / Java 8 = Работает
- Tomcat 8 / Java 7 = не работает
- Tomcat 8 / Java 8 = не работает
это заставляет нас думать, что проблема с Tomcat 8. Либо что-то было изменено в Tomcat 8, и теперь нам нужно установить новые настройки тайм-аута/полезной нагрузки, либо Tomcat 8 имеет ошибку, связанную с этой конкретной проблемой.
мы попытались установить некоторые настройки разъема Tomcat, такие как maxPostSize="-1"
, connectionTimeout="-1"
, disableUploadTimeout="true"
, connectionUploadTimeout="-1"
, keepAliveTimeout="-1"
но ничего из этого не сработало. и, честно говоря, чувствую, как выстрел в темноте, не зная, что происходит на стороне сервера.
мы попытались обновить серверную часть Metro jars до последней версии (jaxws-ri-2.2.10), а также запустить клиент с помощью Java 8. К сожалению, ничего из этого не сработало. Любая помощь будет очень признательна.
2 ответов
оказывается, что Tomcat 7.0.55 включил исправление:
CVE-2014-0230:
Add a new limit, defaulting to 2MB, for the amount of data Tomcat will swallow for an aborted upload. The limit is configurable by maxSwallowSize attribute of an HTTP connector.
мои проблемы были решены путем установки параметра maxSwallowSize= " -1 " на <Connector>
конфигурация на сервере серверов tomcat.XML.
Я хотел бы поблагодарить Марка Томаса и Криса Шульца из списка рассылки пользователей Tomcat за их помощь. Для получения инструкций о том, как присоединиться к списку рассылки нажмите здесь. Я также хотел бы поблагодарить Винаяка за то, что он указал мне на поддержку Tomcat.