Невозможно обработать большие файлы на верблюде, используя http4 - PullRequest
0 голосов
/ 08 апреля 2020

Сценарий, необходимо использовать оставшийся веб-сервис, который предоставляет огромный файл в качестве потока вывода, и наоборот, должен обрабатывать поток и напрямую записывать в файл, а не в память. Служба:

@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 МБ, которая обрабатывает мой маршрут не выполняет потоковую передачу в файл.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

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

disableStreamCache: определяет, кэшируется ли необработанный входной поток из сервлета или нет (Camel будет читать поток в кэш в памяти / переполнение в файл, потоковое кэширование. По умолчанию Camel будет кэшировать входной поток сервлета для поддержки его многократного чтения, чтобы гарантировать, что Camel сможет извлечь все данные из потока. Однако вы можете установить для этого параметра значение true, если вам, например, необходим доступ к необработанному потоку, например, к потоковой передаче его непосредственно в файл или другое постоянное хранилище

0 голосов
/ 12 апреля 2020

Вы должны включить потоковое кеширование, прочитав здесь .

...