JAX-WS MTOM流:服务器在发送之前读取整个流

时间:2013-04-03 19:39:35

标签: java streaming jax-ws mtom

我有一个执行MTOM流媒体的JAX-WS RI服务器。从客户端来说,一切都很好。服务器接收StreamingDataHandler,并且任何一方都不使用大量内存发送1 GB。但是,检索文件时,服务器在发送之前正在读取整个内容。客户端没问题。我在两端使用DataHandler,所以事情的方面很好。我只是不希望服务器在开始发送之前读取InputStream中的所有数据。我对impl有以下注释:

@MTOM
@StreamingAttachment(parseEagerly = false, memoryThreshold = 1L)
@WebService(...)

我已尝试parseEagerly truefalse。我将内存阈值设置为低,因为我并不担心小文件的小性能命中率。

这是JAX-WS RI的错误吗?

1 个答案:

答案 0 :(得分:1)

这就是我所做的。工作就像一个魅力。

界面(认为它与您所做的非常相似)

@WebService
@SOAPBinding(style = Style.RPC)
public interface ResultsServer {    
    @WebMethod
    @XmlMimeType("application/octet-stream")
    public DataHandler getResultDataAsXML(@WebParam Integer raceId) throws Exception;
}

<强>实施

@MTOM
@WebService(endpointInterface = "ca.sportstats.wtc.ResultsServer")
@StreamingAttachment(parseEagerly=true, memoryThreshold=4000000L)
public class ResultsServerImpl implements ResultsServer {

    @Override
    public DataHandler getResultDataAsXML(@WebParam Integer raceId) throws Exception {
        File xmlFile = new File("c:/tmp/xml/response.xml");
        //... write my xml file using an XMLStreamWriter
        return new DataHandler(new FileDataSource(xmlFile));
    }
}

<强>测试

public class Test {
    public static void main(String[] args) throws Exception {

       URL url = new URL("http://url/to/ipmlementation/ResultsServerImplService?wsdl");
       QName qname = new QName("http://test.test.com/", "ResultsServer");

       Service service = Service.create(url, qname);
       ResultsServerImpl resultServer = service.getPort(ResultsServerImpl.class);

       /************  test download  ***************/
       DataHandler handler = resultServer.getResultDataAsXML(4);
       StreamingDataHandler dh = (StreamingDataHandler) handler;
       File file = File.createTempFile("test-received.xml", "");
       dh.moveTo(file);
       dh.close();

    }
}

这对我来说(从服务器)流式传输一个大型XML文件而不是在内存中读取它。

另见