从WCF SOAP服务到JAVA客户端的大文件下载的内存问题

时间:2017-02-02 16:35:37

标签: java web-services wcf soap heap-memory

我们目前有一个现有的WCF SOAP服务,可以与大量客户端一起运行。我们提供StreamBody作为下载更大文件集的方法。我几乎尝试了各种方法来尝试下载大文件,而无需客户端将文件完全加载到内存中。我在每一次尝试中都有。实质上,通过调用以下内容,JAVA客户端希望将完整文件加载到内存中。我在寻找建议。以下是我最近的尝试:

OrderServiceStub stub = getOrderServiceStub();
OrderServiceStub.GetStreamedOrderOutputRequestMessage getStreamedOrderOutputRequestMessage = new OrderServiceStub.GetStreamedOrderOutputRequestMessage();
OrderServiceStub.GetStreamedOrderOutputRequest getStreamedOrderOutputRequest = new OrderServiceStub.GetStreamedOrderOutputRequest();

for (OrderServiceStub.OrderOutput o : orderoutput.getOrderOutput()){
        OrderServiceStub.Guid guidOutput = o.getOrderOutputTicket();
        String fileName = o.getOrderOutputName();
        getStreamedOrderOutputRequest.setOrderOutputTicket(guidOutput);
        getStreamedOrderOutputRequestMessage.setGetStreamedOrderOutputRequest(getStreamedOrderOutputRequest);
        int bufferSize = 1024;

        InputStream is = new BufferedInputStream(stub.getStreamedOrderOutput(getStreamedOrderOutputRequestMessage).getFileData().getStreamBody().getInputStream());
        OutputStream os = new FileOutputStream(new File("C:\\temp\\" + fileName));  

        org.apache.commons.io.IOUtils.copyLarge(is, os);
        org.apache.commons.io.IOUtils.closeQuietly(is);
        org.apache.commons.io.IOUtils.closeQuietly(os);
}

1 个答案:

答案 0 :(得分:0)

不是通过apache复制整个事物,而是尝试将其放入循环,读取bufferSize,然后刷新输出流。然后继续,做同样的事情。希望这会有所帮助。