java - JAXWS SOAP 处理机大型 MTOM 附件

标签 java jax-ws websphere-7 websphere-8

当涉及到肥皂处理程序和大型 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-WS SoapHandler with large messages: OutOfMemoryError

最佳答案

以下是如何使用 WebSphere 内置 JAX-WS 实现来访问 header 而不读取整个消息。

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;

关于java - JAXWS SOAP 处理机大型 MTOM 附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15979580/

相关文章:

java - Feign 客户端对不需要身份验证的 URL 抛出未经授权的异常

java - JPA 通过刷新嵌套实体策略持久化实体

java - jax-ws 服务返回数组列表

在使用 IIS WebSphere 插件的 WebSphere 7 中使用非英语语言时,CSS 不会加载并出现 500 错误

jakarta-ee - 如何获取传递到 JAX-WS 服务客户端的登录凭证及其关联的策略集和 Rational/WebSphere 工具中的绑定(bind)

eclipse - 如何将 WebSphere Application Server 7 集成到 Rational Software Architect 中?

java - 需要帮助从 sqlite 数据库创建图像

java - Android - NullPointerException 和 RuntimeException

java - 在java中从WS检索正确的数据

Maven 使用 JAX-WS 2.1 而不是 JAX-WS 2.2