Мы хотим включить прямую потоковую передачу наших полезных данных в конечных точках веб-службы. Нам необходимо обработать большой объем данных, и мы хотим передавать данные в потоковом режиме во время обработки.
Мы используем 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
с ByteAreamrrayOut
и вызывает полезную нагрузку, чтобы разрешить запись, как описано выше.
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();
}
Так что мне это не подходит. Можно ли добиться прямой трансляции? Есть идеи для этого? Заранее спасибо!
Обновление : я наконец создал билет JIRA (SWS-704) для Spring WS. Если вы хотите увидеть, как это реализовано, рассмотрите возможность просмотра / голосования на странице JIRA. Надеюсь, мы получим хотя бы полезный ответ.