2015-12-02 103 views
5

我們最近已將JRE 1.7.0_17/Tomcat7.0.39上運行的JAX-WS webservice的技術堆棧更新爲JRE 1.8。 0_66/Tomcat 8.0.28。該Web應用程序在Windows Server 2012上運行。該Web服務使用JAX-WS的Metro實現。客戶端使用JRE 7和內置於JRE中的JAX-WS客戶端API在各種Windows版本上運行。 Web服務用於將文件從客戶機上傳到Web服務,並將這些文件保存在文檔管理系統中。這個實現在Java 7/Tomcat 7下非常完美地工作,但是我們遇到了在Java 8/Tomcat 8服務器端運行的更大有效負載(2MB或更大)的問題。來自客戶端的堆棧跟蹤是:javax.xml.ws.WebServiceException:java.io.IOException:向服務器Tomcat寫入錯誤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.access$500(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.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$4.run(Unknown Source) 
    at java.awt.EventQueue$4.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 

不幸的是,在任何tomcat日誌中都沒有記錄服務器端。我花了幾天的時間尋找解決方案,但沒有成功。我試圖通過各種途徑來調試問題,例如使用 -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true(客戶端)和 -Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true(服務器)Java系統屬性記錄SOAP請求/響應客戶端和服務器端,但當發生錯誤時,只有客戶端請求是被記錄:

---[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/8的Java工程=
  • Tomcat的8/Java 7的=不工作
  • Tomcat的8/Java的8 =不起作用

這使我們認爲,這個問題是在Tomcat 8.無論是東西Tomca改變t 8,現在我們需要設置一些新的超時/有效負載設置,或者Tomcat 8有與此特定問題相關的錯誤。

我們已經嘗試設置一些Tomcat連接設置,如maxPostSize="-1"connectionTimeout="-1"disableUploadTimeout="true"connectionUploadTimeout="-1"keepAliveTimeout="-1" 但這些都不工作,真的覺得像在黑暗中拍攝不知道什麼是在服務器端去。

我們嘗試將Metro Jars服務器端更新爲最新版本(jaxws-ri-2.2.10)以及使用Java 8運行客戶端。不幸的是,這些工作都不成功。任何幫助將不勝感激。

回答

1

事實證明,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」 在tomcat服務器上的<Connector>配置設置服務器.XML。

我想感謝來自Tomcat用戶郵件列表的Mark Thomas和Chris Schultz的幫助。有關如何加入郵件列表的說明,請點擊here。我還要感謝Vinayak指出我對Tomcat的支持。

+0

你應該接受你自己的答案作爲答案。 :) –

+0

maxSwallowSize是什麼意思? – Nurlan