Таким образом, хаком было бы написать собственный настраиваемый контроллер сервлета / пружины, который обрабатывал бы этот конкретный ответ и выводил поток мыльного конверта, затем вашу полезную нагрузку, а затем конечный тег мыльного конверта. Это при условии, что у вас нет требований к 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. Надеюсь, мы получим хотя бы полезный ответ.

Ответы на вопрос(3)

Ваш ответ на вопрос