1

我正在构建一个 SOAP 网络服务。我正在使用 JAX-WS 创建此服务并将其部署在 Glassfish 3.1.2 服务器上。

让这个服务返回一个带有我想要的 XML 表示的字符串构建没有问题。我也可以让它返回一个特定的对象。我遇到的问题是流式传输此资源。

这是我到目前为止所拥有的:

接口

@MTOM
@WebService
@XmlRootElement(name="root.element.class.location")
@SOAPBinding(style = Style.RPC, use=Use.LITERAL)
public interface ResultsServer {

    @WebMethod
    @XmlMimeType("text/xml")
    public Test getResultDataAsXML(@WebParam(name="Id") Integer id) throws Exception;
}

实施

- - 编辑 - -

这是我想流式传输我的资源的地方。假设我需要我的results对象变得非常大,我不想持有这是内存并且想在不持有它的情况下开始发送它。(在代码中对此进行了注释)

@WebService(endpointInterface = "my.endpoint.class")
@StreamingAttachment(parseEagerly=true, memoryThreshold=4000000L)
public class ResultsServerImpl implements ResultsServer {

    @Override 
    public Test getResultDataAsXML(Integer id) throws Exception {
        Test results = new Test();
        for(int i=0; i<[very large number]; i++) {
            results.getResults().add("here : " + i);
            /**at one point, this is too large to hold in memory
            I would like to be able to start returning the object here
            so it is not taking up all available memory */
        }
        return results; //or close the stream
    }
}

---- 结束编辑 ----

我的Test课程是一个简单的课程,如下所示:

public class Test {

    private ArrayList<String> results;

    public Test() {
        results = new ArrayList<String>();
    }

    public ArrayList<String> getResults() {
        return results;
    }

    public void setResults(ArrayList<String> results) {
        this.results = results;
    }
}

让我们假设这个Test对象变得非常大(并且更复杂)。我需要能够流式传输此对象。我将如何继续进行流式传输。

理想情况下,我想保留这个对象的结构。

从我目前所读的内容来看,我需要以某种方式转换这个对象DataHandler并返回这个对象。

欢迎任何帮助!谢谢你。

4

2 回答 2

0

JAX-WS 实现将利用 JAXB 实现来编组对象(很可能是 StAX XMLStreamWriter),因此输出将被流式传输(不会在内存中创建 XML 文档)。

@BlaiseDoughan 我认为您已经按照我正在寻找的方式措辞了。是的,那是为了防止 Test 的实例完全保存在内存中。有没有办法做到这一点?

如果您希望数据在消息中显示为 XML(而不是 SOAP 附件),您可以利用 JAXB 的编组事件。如果beforeMarshal您可以将数据加载到对象中,然后在afterUnmarshal方法中将其清除。最终所有数据都将被拉入,但不会同时被引用。

于 2013-05-27T20:47:29.073 回答
-1

我建议您使用 thinkworks 中的 xstream ( http://x-stream.github.io/ ) 库进行流式传输,因为它可以在您的服务双方绑定并且与 SOAP 信封兼容。事实上,甚至还有与 ActiveSOAP 的集成。

可以在http://jira.codehaus.org/secure/attachment/19097/SoapEnvelopeTestCase.java中查看 SOAP 信封包装的 xstream 对象的示例。jboss 的完整用法可以在https://issues.jboss.org/secure/attachment/12325534/SOAPClient.java?_sscc=t看到。

XStream 已用于一些非常大的流式处理(我已经将它用于一些 100+ MB 的大型文本对象而没有问题)。

于 2013-05-27T19:45:11.720 回答