如何将 SOAP 的直接流与 Spring-WS 结合使用?

2022-09-03 07:57:23

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

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

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

writer.writeStartElement("exampleResponse")

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

writer.writeEndElement()

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

的实现显示了这一点(可以在弹簧鱼眼中查看)。调用您的StreamingPayload实现,并为此为您提供一个编写器。StreamingOMDataSourceStreamingOMDataSource

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

   ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
   return StAXUtils.createXMLStreamReader(bis);
}

该方法使用 和 调用负载来创建 并启用写入,如上所述。#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();
}

所以这对我来说是不可用的。是否可以实现直接流式传输?对此有什么想法吗?提前感谢您!


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


答案 1

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

<bean id="messageFactory" 
      class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
     <property name="payloadCaching" value="false"/>
</bean> 

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


答案 2

您不能(永远)在 Web 服务中流式传输数据,就像随着时间的推移在单个 Web 服务请求中通过 HTTP 连接连续发送 XML 一样。您必须进行许多单个 Web 服务调用,或者将多个调用累积为一个。

如果你需要高性能,Web服务就不是很好。但是你可以手动优化简单的Web服务,这并不难。但是,如果您需要更高的性能,切换到另一种传输格式将更加“物有所值”。我仍然会通过HTTP保留一些东西 - 特别是如果你有一些身份验证要求。


推荐