2012-08-17 54 views
1

我嘗試使用Mtom傳輸文件,直到我使用SoapHandler驗證客戶端簽名爲止它工作得很好。 SoapHandler保留所有消息並將其更改爲base64編碼。所以當我嘗試獲取大文件時,JVM會拋出堆大小異常。你們有沒有辦法解決這個問題?使用SOAPHandler時MTOM不起作用

+0

這並不嚴格回答你的問題,但是有可能使用REST服務而不是SOAP?我問,因爲幾年前,我花了很長時間試圖讓MTOM處理大型二進制文件,最終放棄了。後來,我意識到不是試圖將二進制對象放入SOAP信封中,而是將該文件表示爲URI並將其作爲響應流返回。 – Ickster 2012-09-17 12:58:24

回答

2

Java JRE附帶JAX-WS提供程序。這個提供者有我會考慮的錯誤。如果SoapHandler被添加,無論是通過直接獲取HandlerChain還是通過使用HandlerResolver,都將使用MTOM正確創建的消息解構,並將附件內聯放置在SOAP消息中。如果附件很大,則可能導致性能很差或內存不足錯誤。

我發現的唯一解決方案是使用另一個JAX-WS提供程序。從測試中,Axis2似乎完美地工作(雖然它有大量的依賴關係)。簡單地將另一個提供者放在類路徑上會導致它被使用。 Java在META-INF/services中查找名爲javax.xml.ws.spi.Provider的文件。如果找到該文件,它將使用指定的提供程序。主Axis2 jar將包含該文件以確保使用Axis2提供程序。其他提供商也可能解決這個問題。

由於此自動提供程序檢測,您可能會發現您的應用程序確實或沒有此問題,具體取決於它在哪裏運行。例如,如果您將應用程序部署到IBM WebSphere,那麼它已經覆蓋了默認的提供程序,您將不會遇到此問題。其他應用程序服務器可能也會覆蓋默認的提供程序。如果您可以獲得副本,IBM還提供了一個非常好的jar,com.ibm.jaxws.thinclient_7.0.0.jar,其中包含了Axis2。這隻能用於獨立應用程序(那些不在WebSphere中運行的應用程序),但它非常方便,並且可以解決此問題。