gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:45:09 25 4
gpt4 key购买 nike

当涉及到肥皂处理程序和大型 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com