Как использовать прямую потоковую передачу для SOAP с Spring-WS?

Мы хотим включить прямую потоковую передачу наших полезных данных в конечных точках веб-службы. Нам необходимо обработать большой объем данных, и мы хотим передавать данные в потоковом режиме во время обработки.

Мы используем 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. Надеюсь, мы получим хотя бы полезный ответ.

16
задан Christopher Klewes 27 April 2011 в 10:04
поделиться