当前位置: 首页 > 面试题库 >

JAXWS Soap Handler大型MTOM附件

公孙志
2023-03-14
问题内容

当涉及肥皂处理程序和大型MTOM附件时,IBM WebSphere
7和8中的JAXWS实现似乎存在一些问题。似乎在SOAPMessageContext对象上调用getMessage()时,会将整个消息(包括所有附件二进制内容)读入内存。这很容易导致JVM耗尽可用内存。

@Override
public boolean handleMessage(SOAPMessageContext context) {
    SOAPMessage soapMsg = context.getMessage();

    ...
}

在上面的代码片段中,如果传入的请求附件大于JVM中可用的可用内存量,context.getMessage()可能会导致内存不足异常。

如何获得对SoapHeader元素的访问权限而又不触发此不良功能?我看到SOAPMessageContext类具有getHeaders(…)方法,但是我不确定如何准确地使用它。我特别不确定JAXBContext传递什么。有人可以提供示例或说明如何使用此方法吗?

这是另一篇有关stackoverflow的文章:具有大消息的JAX-WSSoapHandler:OutOfMemoryError


问题答案:

这是在不使用WebSphere内置JAX-WS实现读取整个消息的情况下访问标头的方法。

public boolean handleMessage(SOAPMessageContext context) {

    AttributedURI messageIdURI = (AttributedURI)context.get("com.ibm.wsspi.wsaddressing.inbound.MessageID");
    String messageId = "";
    if (messageIdURI != null && messageIdURI.getURI() != null) {
        messageId = messageIdURI.getURI().toString();
    }
    EndpointReference fromApplicationEPR = (EndpointReference)context.get("com.ibm.wsspi.wsaddressing.inbound.FromEPR");
    String fromApplication = "";
    if (fromApplicationEPR != null && fromApplicationEPR.getAddress() != null &&
        fromApplicationEPR.getAddress().getURI() != null) {
        fromApplication = fromApplicationEPR.getAddress().getURI().toString();
    }

    ...

    return true;
}

注意,这取决于精确的JAX-WS实现。如果有机会,我将通过Apache CXF发布如何执行此操作。这是上述代码所需的导入:

import com.ibm.ws.wsaddressing.AttributedURI;
import com.ibm.ws.wsaddressing.EndpointReference;


 类似资料:
  • 请告诉我这是否可能,如果可能,给我任何提示如何做。

  • 该应用程序在本地和tomcat服务器上运行良好,但是,当我们将该应用程序移动到WebLogic12c服务器(war部署)时,我们在访问服务时会看到以下错误。 BEA-382120错误:不允许混合XOP/MTOM和附件! 在WebLogic上部署时,消息似乎不再启用MTOM。 Spring WS配置,使用的库:spring-ws-1.5.8.jar commons-httpclient-3.1.ja

  • 我正在使用CXF2.7.7构建一个WSDL优先的java Web服务,该服务使用MTOM。我的目的是能够通过这个Web服务上传大型(多GB)文件,下面是我的WSDL的一个片段 我的意图是使用MTOM(从元素type=“xs:base64binary”xmime:expectedcontenttypes=“application/octet-stream中可以看出)通过该服务上载对象。 类似地,我还

  • 我可以一起使用SAAJ和MTOM吗?

  • 我正试图将一个大的(>4MB)附件上载到Office365中的现有邮件中。我遵循以下说明:https://docs.microsoft.com/en-us/graph/outlook-large-attachments?tabs=http 我已经成功创建了上传会话,并获得了一个看起来合法的uploadUrl值,它与文档中的示例大致匹配。然后,我开始对这个url进行PUT操作,用于我选择的第一个字节

  • 在http://axis.apache.org/axis2/java/core/docs/mtom-guide.html#mtom_backward_compatibility_with_swa链接上,“content-id”用尖括号指定。 --mimeboundary4a7ae55984e7438034 content-type:application/octet-stream content-