java - 웹서비스 - spring-ws example




Spring-WS로 SOAP을위한 직접 스트리밍을 사용하는 방법? (2)

웹 서비스 엔드 포인트에서 페이로드를 직접 스트리밍 할 수 있어야합니다. 많은 양의 데이터를 처리해야하며 처리하는 동안 데이터를 스트리밍해야합니다.

버전 2.0.0에서는 spring-ws-core를 사용하고 엔드 포인트 매퍼로 PayloadRootQNameEndpointMapping 을 사용합니다. 메세지 팩토리로서 우리는 AxiomSoapMessageFactory 사용하고 AxiomSoapMessageFactory . StreamingPayload 와 그에 상응하는 writeTo(XMLStreamWriter writer) 메소드를 구현합니다.이 메소드는 우리의 페이로드를 작성하는 데 사용됩니다 (스프링 - ws JIRA 티켓 SWS-352 ).

오류없이 정상적으로 작동하지만 직접 스트리밍하려고했습니다! 이것은 분명히 불가능합니다. 우리는 행동을 평가하기 위해 데이터를 스트리밍 한 곳에서 간단한 테스트를 실시했습니다.

writer.writeStartElement("exampleResponse")

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

writer.writeEndElement()

우리는 이것이 소비자 / 클라이언트에게 직접 스트리밍 될 것이므로 비누 헤더가 이미 작성자에게 쓰여지고 끝점이 완료된 후에 닫히는 것으로 가정했습니다. 불행히도 이것은 불가능합니다. 스트림을 직접 사용할 수 없습니다! 스트림은 Spring-ws 소스에있는 ByteArrayInputStream 래핑됩니다.

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() 메서드는 ByteArrayOutputStream 사용하여 XMLStreamWriter 를 만들고 위에서 설명한대로 쓰기를 가능하게하는 페이로드를 호출합니다.

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();
}

그래서 이것은 나에게 쓸모가 없다. 직접 스트리밍을 할 수 있습니까? 이것에 대한 아이디어가 있습니까? 미리 감사드립니다.

업데이트 : 마지막으로 Spring WS 용 JIRA 티켓 (SWS-704) 을 만들었습니다. 그것을보고 싶다면 JIRA 페이지에서보기 / 투표하는 것을 고려하십시오. 잘만되면 우리는 적어도 유용한 대답을 얻는다.


나는 해킹에 대해서만 생각할 수있다 - 스택 (cxf, spring ws 등)은 응답 xml의 유효성을 검사해야하므로 보안이 활성화 된 경우 암호화 키를 계산할 수 있기 때문에 전체 메시지를 버퍼링한다.

따라서 해킹은이 특정 응답을 처리하고 비누 봉투, 그리고 페이로드, 비누 봉투의 끝 태그를 스트리밍하는 사용자 지정 서블릿 / 스프링 컨트롤러를 작성하는 것입니다. 이것은 WSS 요구 사항이 없다고 가정합니다.


시간이 지남에 따라 하나의 웹 서비스 요청에서 HTTP 연결을 통해 XML을 계속 전송하는 것처럼 웹 서비스 내에서 데이터를 스트리밍 할 수 없습니다 (결코해서는 안 됨). 많은 단일 웹 서비스 호출을 작성하거나 여러 호출을 하나로 축적해야합니다.

고성능이 필요한 경우 웹 서비스는 훌륭하지 않습니다. 그러나 간단한 웹 서비스를 손으로 최적화 할 수는 있습니다. 하지만 더 높은 성능이 필요한 경우 다른 전송 형식으로 전환하는 것이 더 많은 비용이 듭니다. 난 여전히 HTTP를 통해 일을 지킬거야 - 특히 당신은 몇 가지 인증 요구 사항이있다.





spring-ws