Мы хотим включить прямую потоковую передачу наших полезных данных в конечных точках веб-сервиса.Мы должны обработать большой объем данных и хотим передавать данные во время обработки.
Мы используем spring-ws-core версии 2.0.0 и используем PayloadRootQNameEndpointMapping
в качестве средства отображения конечных точек.В качестве фабрики сообщений мы используем AxiomSoapMessageFactory
.Мы реализуем StreamingPayload
и соответствующий writeTo(XMLStreamWriter writer)
метод, который мы используем для записи нашей полезной нагрузки (в соответствии с билетом Spring-ws JIRA, * 1007 * 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();
}
Так что это не для меня.Можно ли добиться прямой потоковой передачи?Есть идеи для этого?Заранее спасибо!
Обновление : Я наконец создал билет JIRA (SWS-704) для Spring WS.Если вы хотите, чтобы это было реализовано, рассмотрите возможность просмотра / голосования на странице JIRA.Надеюсь, мы получим хотя бы полезный ответ.