【问题标题】:MTOM not working when using SOAPHandler使用 SOAPHandler 时 MTOM 不工作
【发布时间】:2012-08-17 08:47:42
【问题描述】:

我尝试使用 Mtom 传输文件,在我使用 SoapHandler 验证客户端签名之前,它运行良好。 SoapHandler 保留所有消息并将其更改为 base64 编码。因此,当我尝试获取大文件时,Jvm 会引发堆大小异常。你们知道有什么方法可以解决这个问题吗?

【问题讨论】:

  • 这并不能严格回答您的问题,但是是否可以使用 REST 服务而不是 SOAP?我问是因为几年前,我一直试图让 MTOM 处理大型二进制文件,但最终放弃了。后来,我意识到与其尝试将二进制对象放入 SOAP 信封中,不如将文件表示为 URI 并将其作为响应流返回。

标签: java out-of-memory mtom soaphandler


【解决方案1】:

Java JRE 附带一个 JAX-WS 提供程序。这个提供者有我认为的错误。如果通过直接获取 HandlerChain 或使用 HandlerResolver 添加了 SoapHandler,则使用 MTOM 正确创建的消息将被解构,并且附件被内联放置在 SOAP 消息中。如果附件很大,这可能会导致性能非常差或内存不足错误。

我找到的唯一解决方案是使用另一个 JAX-WS 提供程序。从测试来看,Axis2 似乎工作得很好(尽管它有大量的依赖项)。只需将另一个提供程序放在类路径上即可使用它。 Java 在 META-INF/services 中查找名为 javax.xml.ws.spi.Provider 的文件。如果找到此文件,它将使用指定的 Provider。主 Axis2 jar 将包含此文件以确保使用 Axis2 提供程序。其他 Provider 也可以解决这个问题。

由于这种自动提供程序检测,您可能会发现您的应用程序存在或不存在此问题,具体取决于它运行的位置。例如,如果您将应用程序部署到 IBM WebSphere,它已经覆盖了默认提供程序,您将不会遇到此问题。可能其他应用程序服务器也覆盖了默认提供程序。如果您能获得一份副本,IBM 还提供了一个非常好的 jar,com.ibm.jaxws.thinclient_7.0.0.jar,其中包含 Axis2。这只能用于独立应用程序(那些不在 WebSphere 中运行的应用程序),但它非常方便并解决了这个问题。

【讨论】:

    猜你喜欢
    • 2018-02-05
    • 2010-09-17
    • 2015-05-26
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多