如何使用Spring-WS直接传输SOAP?

Chr*_*wes 16 java streaming spring soap spring-ws

我们希望在Web服务端点中启用有效负载的直接流式传输.我们必须处理大量数据,并希望在处理时传输数据.

我们在版本2.0.0中使用spring-ws-core并使用PayloadRootQNameEndpointMappingas endpoint mapper.作为消息工厂,我们正在使用AxiomSoapMessageFactory.我们实现了StreamingPayload相应的writeTo(XMLStreamWriter writer)方法,我们用它来编写有效载荷(根据spring-ws JIRA票证,SWS-352).

这没有任何错误,但我们想直接流!这显然是不可能的.我们做了一个简单的测试,我们流式传输一些数据以评估行为.

writer.writeStartElement("exampleResponse")

10000.times
{
    writer.writeStartElement("example")
    writer.writeEndElement()    
}

writer.writeEndElement()
Run Code Online (Sandbox Code Playgroud)

我们假设这将直接流式传输到使用者/客户端,因此soap头已经写入我们的编写器并在端点完成后关闭.不幸的是,这是不可能的,流不能直接使用!流被包裹在一个ByteArrayInputStream,在spring-ws源中找到.

执行StreamingOMDataSource显示此(可以在SpringEye中查看).该StreamingOMDataSource呼叫你的StreamingPayload实现和给你一个作家这一点.

public XMLStreamReader getReader() throws XMLStreamException {
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   serialize(bos, null);

   ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
   return StAXUtils.createXMLStreamReader(bis);
}
Run Code Online (Sandbox Code Playgroud)

该方法#serialize()创建XMLStreamWriterByteArrayOutputStream并调用有效载荷,能写入,如上所述.

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();
}
Run Code Online (Sandbox Code Playgroud)

所以这对我来说无法使用.是否有可能实现直接流媒体?有什么想法吗?先感谢您!


更新:我最终为Spring WS 创建了一个JIRA票证(SWS-704).如果你想看到它实现,请考虑在JIRA页面上观看/投票.希望我们至少得到一个有用的答复.

Chr*_*wes 4

您还必须禁用有效负载缓存:

<bean id="messageFactory" 
      class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
     <property name="payloadCaching" value="false"/>
</bean> 
Run Code Online (Sandbox Code Playgroud)

通过此设置,我们终于能够使用 Spring WS 执行 SOAP 的直接流式传输!