0

一个场景,需要使用一个提供大文件作为流输出的rest webservice,反之亦然,需要处理流并直接写入文件而不是内存。服务 :

@RequestMapping(value = "downloadFile", method = RequestMethod.GET)
public StreamingResponseBody getSteamingFile(HttpServletResponse response) throws IOException {
    response.setContentType("application/octet-stream");
    InputStream inputStream = new FileInputStream(new File("data\\test_big.txt"));
    return outputStream -> {
        int nRead;
        byte[] data = new byte[1024];
        System.out.println("Writing some bytes..");
        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
            outputStream.write(data, 0, nRead);
        }
        System.out.println("Completed #####");  
        outputStream.flush();
        outputStream.close();
        response.flushBuffer();
    };

}

消费者路线:

.to("http4://localhost:8080/downloadFile")
        .process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                InputStream is = exchange.getIn().getBody(InputStream.class);
                File ret = File.createTempFile("loadTest", "tmp");
                FileOutputStream fos = new FileOutputStream(ret);
                StreamUtils.copy(is, fos);
                System.out.println("File Name "+ ret.getName());
                is.close();
                fos.flush();
                fos.close();
            }
        });

256 JVM 在处理 300 MB 时内存不足,因为我的路由没有执行流式传输到文件。

4

2 回答 2

0

.to("http4://localhost:8080/downloadFile?disableStreamCache=true")

disableStreamCache:确定来自 Servlet 的原始输入流是否被缓存(Camel 会将流读入内存/溢出到文件,流缓存)缓存。默认情况下,Camel 将缓存 Servlet 输入流以支持多次读取,以确保 Camel 可以从流中检索所有数据。但是,当您需要访问原始流(例如将其直接流式传输到文件或其他持久存储)时,您可以将此选项设置为 true

于 2020-04-15T13:33:41.387 回答
-1

您必须在此处启用流缓存读取。

于 2020-04-12T15:11:33.023 回答