我們希望能夠在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