我们希望能够在web服务端点直接传输我们的有效载荷。我们必须处理大量的数据,并希望在处理数据时对数据进行流式处理。如何使用Spring-WS直接使用SOAP进行SOAP?
我们使用spring-ws-core,版本2.0.0,并使用PayloadRootQNameEndpointMapping
作为终点映射器。作为消息工厂,我们使用AxiomSoapMessageFactory
。我们实施了StreamingPayload
和相应的writeTo(XMLStreamWriter writer)
方法,我们用它来编写我们的有效载荷(根据spring-ws JIRA票证,SWS-352)。
这工作正常没有任何错误,但我们想直接流!这显然是不可能的。我们通过流式传输一些数据来评估行为,我们做了一个简单的测试。
writer.writeStartElement("exampleResponse")
10000.times
{
writer.writeStartElement("example")
writer.writeEndElement()
}
writer.writeEndElement()
我们假定这将直接传输到消费者/客户端,所以肥皂头已经写入到我们的作家和端点完成后关闭。不幸的是,这是不可能的,该流不能直接使用!流包裹在一个ByteArrayInputStream
,在spring-ws源文件中找到。
StreamingOMDataSource
的实现显示了这一点(可以在springs FishEye中查看)。 StreamingOMDataSource
调用您的StreamingPayload实现并为您提供一个编写器。
public XMLStreamReader getReader() throws XMLStreamException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
serialize(bos, null);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
return StAXUtils.createXMLStreamReader(bis);
}
方法#serialize()
创建XMLStreamWriter
与ByteArrayOutputStream
并调用有效载荷,能写入,如上所述。
public void serialize(OutputStream output, OMOutputFormat format)
throws XMLStreamException
{
XMLStreamWriter streamWriter;
if ([...]) {
// Create stream writer with defined charset
}
else {
streamWriter = StAXUtils.createXMLStreamWriter(output);
}
serialize(streamWriter);
}
public void serialize(XMLStreamWriter xmlWriter) throws XMLStreamException {
payload.writeTo(xmlWriter);
xmlWriter.flush();
}
因此,这是不适合我使用。是否有可能实现直接流式传输?任何想法?先谢谢你!
更新:我终于春季WS创建JIRA ticket (SWS-704)。如果你想看看它的实现,可以考虑在JIRA页面上观看/投票。希望我们至少得到一个有用的答复。
我没有看到SWS-352允许流式传输?你知道web服务通过HTTP正确吗? – ThomasRS 2011-04-05 01:06:05