java - 如何使用 Spring-WS 的 SOAP 直接流式传输?

标签 java spring soap streaming spring-ws

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

我们在 2.0.0 版本中使用 spring-ws-core 并使用 PayloadRootQNameEndpointMapping作为端点映射器。作为消息工厂,我们使用 AxiomSoapMessageFactory .我们实现 StreamingPayload和相应的writeTo(XMLStreamWriter writer)方法,我们用它来编写我们的有效负载(根据 spring-ws JIRA 票证,SWS-352)。

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

writer.writeStartElement("exampleResponse")

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

writer.writeEndElement()

我们假设这将直接流式传输到消费者/客户端,因此soap header 已经写入我们的编写器并在端点完成后关闭。不幸的是这是不可能的,流不能直接使用!流包裹在 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()创建 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();
}

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


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

最佳答案

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

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

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

关于java - 如何使用 Spring-WS 的 SOAP 直接流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5165055/

相关文章:

java - String name[] = {}; 有什么区别?和字符串 [] 名称 = {};

java - SchedulerFactory 是否能够在启动时为 quartz 创建表?

java - Envers 将审计表元数据传递给 Hibernate 的类和方法是什么?

python - 用Python的spyne修改soap webservice中的WSDL

java - 使用 XPath 和 XML XPath Api 获取 Soap Body

java - Revapi 在配置阶段不断失败

java - 如何使用 Spring 连接模型 View 和 Controller

java - Android spinnerStyle 不工作

java - 当我使用@Transactional时hibernateFilter。是必然的吗?

java - 我想在 SOAP 体元素中传递我的自定义对象,该怎么做?