我尝试使用 Mtom 传输文件,在我使用 SoapHandler 验证客户端签名之前它运行良好。SoapHandler 保留所有消息并将其更改为 base64 编码。因此,当我尝试获取大文件时,Jvm 会引发堆大小异常。你们知道有什么方法可以解决这个问题吗?
1 回答
Java JRE 带有一个 JAX-WS Provider。该提供商有我认为的错误。如果通过直接获取 HandlerChain 或使用 HandlerResolver 添加了 SoapHandler,则使用 MTOM 正确创建的消息将被解构,并且附件被内联放置在 SOAP 消息中。如果附件很大,这可能会导致性能非常差或内存不足错误。
我发现的唯一解决方案是使用另一个 JAX-WS 提供程序。从测试来看,Axis2 似乎运行良好(尽管它有大量依赖项)。只需在类路径上放置另一个提供程序即可使用它。Java 在 META-INF/services 中查找名为 javax.xml.ws.spi.Provider 的文件。如果找到此文件,它将使用指定的 Provider。主 Axis2 jar 将包含此文件以确保使用 Axis2 提供程序。其他提供商也可能会解决此问题。
由于这种自动提供程序检测,您可能会发现您的应用程序存在或不存在此问题,具体取决于它运行的位置。例如,如果您将应用程序部署到 IBM WebSphere,它已经覆盖了默认提供程序,您将不会遇到此问题。可能其他应用程序服务器也覆盖了默认提供程序。如果您能获得一份副本,IBM 还提供了一个非常不错的 jar,com.ibm.jaxws.thinclient_7.0.0.jar,其中封装了 Axis2。这只能用于独立应用程序(那些不在 WebSphere 中运行的应用程序),但它非常方便并解决了这个问题。