Запуск командной строки в Java с использованием Runtime.getRuntime () - PullRequest
0 голосов
/ 11 апреля 2019

Я создаю веб-приложение с помощью весенней загрузки, в этом веб-приложении мне нужно запустить командную строку с помощью Runtime.getRuntime (), но проблема в том, что: эта команда выполняется после веб-приложения и это не то, что я хочу сделать, вопрос в следующем:

" как я могу убедиться, что инструкция Runtime.getRuntime () запускается при вызове в приложении весенней загрузки (не в конце) "

контроллер:

@PostMapping("/toLinPDf")
public ResponseEntity<ByteArrayResource> convertion(@RequestParam(value = "input", required = false) String in,
        @RequestParam(value = "output", required = false) String out) throws IOException, InterruptedException, ExecutionException {

    // the methode LinearizePDF contain the command line

    linearizeService.LinearizePDf(in, out);
    logger.warn("call the method linearizeService.LinearizePDf ");
    FileSystemResource result = new FileSystemResource(out);
    return ResponseEntity
            .ok()
            .contentLength(result.contentLength())
            .contentType(
                    MediaType.parseMediaType("application/pdf"))
            .body(new ByteArrayResource(IOUtils.toByteArray(result.getInputStream())));

}

linearizeService (содержит метод LinearizePDf (in, out)):

@Async
public void LinearizePDf(String Input , String Output) throws IOException, InterruptedException {
     Runtime rt = Runtime.getRuntime();

     // the command line 
     String command = "qpdf --linearize " + Input + "  " + Output;

     Process pr = rt.exec(command );
     logger.warn("run the command");
     pr.destroy();   
}

Пожалуйста, если есть предложения, не стесняйтесь.

Спасибо!

1 Ответ

1 голос
/ 11 апреля 2019

Цитирование известного сайта

Проще говоря - аннотирование метода bean с помощью @Async сделает это выполнить в отдельном потоке, то есть вызывающий не будет ждать завершение вызванного метода.

Удалить @Async из LinearizePDf

Кроме того, чтобы дождаться завершения внешнего процесса, вы должны использовать waitFor, а не destroy, например. pr.waitFor()

...