gpt4 book ai didi

soap - 带有大消息的 JAX-WS SoapHandler : OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-04 05:06:36 25 4
gpt4 key购买 nike

使用 JAX-WS 2,我看到了其他人也提到过的一个问题。问题是,如果在处理程序中接收到 SOAP 消息,并且该 SOAP 消息很大——无论是由于碰巧有大量内容的内联 SOAP 正文元素,还是由于 MTOM 附件——那么很容易获得一个内存不足错误。

原因是对 getMessage() 的调用似乎引发了一系列事件,这些事件涉及读取线路上的整个 SOAP 消息,并创建一个(或多个)对象来表示线路上的内容。

例如:

...
public boolean handleMessage(SOAPMessageContext context)
{
// for a large message, this will cause an OutOfMemoryError
System.out.println( context.getMessage().countAttachments() );
...

我的问题是:是否有处理此问题的已知机制/解决方法?具体来说,访问 SOAP 消息中的 SOAP 部分而不强制附件(例如 MTOM)也被清理会很好。

最佳答案

实际上有一个非常有效的 JAX-WS RI(又名 Metro)特定解决方案。

https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri .不幸的是,该链接现已损坏,但您可以在 WayBack Machine 上找到它。我将在下面列出重点:

2007 年的地铁人 introduced附加处理程序类型,MessageHandler<MessageHandlerContext> ,这是 Metro 专有的。远比SOAPHandler<SOAPMessageContext>高效因为它不会尝试在内存中进行 DOM 表示。

这是原始博客文章中的关键文本:

MessageHandler:

Utilizing the extensible Handler framework provided by JAX-WS Specification and the better Message abstraction in RI, we introduced a new handler called MessageHandler to extend your Web Service applications. MessageHandler is similar to SOAPHandler, except that implementations of it gets access to MessageHandlerContext (an extension of MessageContext). Through MessageHandlerContext one can access the Message and process it using the Message API. As I put in the title of the blog, this handler lets you work on Message, which provides efficient ways to access/process the message not just a DOM based message. The programming model of the handlers is same and the Message handlers can be mixed with standard Logical and SOAP handlers. I have added a sample in JAX-WS RI 2.1.3 showing the use of MessageHandler to log messages and here is a snippet from the sample:


public class LoggingHandler implements MessageHandler<MessageHandlerContext> {
public boolean handleMessage(MessageHandlerContext mhc) {
Message m = mhc.getMessage().copy();
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
m.writeTo(writer);
} catch (XMLStreamException e) {
e.printStackTrace();
return false;
}
return true;
}

public boolean handleFault(MessageHandlerContext mhc) {
.....
return true;
}

public void close(MessageContext messageContext) { }

public Set getHeaders() {
return null;
}
}

(引自 2007 年博客文章的结尾)

您可以找到 full exampleMetro GitHub repo .

关于soap - 带有大消息的 JAX-WS SoapHandler : OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15462192/

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