Таким образом, хаком было бы написать собственный настраиваемый контроллер сервлета / пружины, который обрабатывал бы этот конкретный ответ и выводил поток мыльного конверта, затем вашу полезную нагрузку, а затем конечный тег мыльного конверта. Это при условии, что у вас нет требований к WSS.
тим включить прямую потоковую передачу наших полезных данных в конечных точках веб-сервиса. Мы должны обработать большой объем данных и хотим передавать данные во время обработки.
Мы используем 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
, найденный в источнике весны-ws.
РеализацияStreamingOMDataSource
показывает это (можно посмотреть впружины 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) для весны WS. Если вы хотите, чтобы это было реализовано, рассмотрите возможность просмотра / голосования на странице JIRA. Надеюсь, мы получим хотя бы полезный ответ.