Spring Boot - следует ли реализовать многопоточность для решения этой проблемы? - PullRequest
0 голосов
/ 04 августа 2020

Я работал над некоторым веб-проектом, и один из его запросов выполняет командную строку с использованием Java Process.

Это метод.

@ResponseBody
    @RequestMapping(value = "/startTest", method = RequestMethod.POST)
    public String startTest(int test_id) {
        ...

        String cmd = "..."

        ProcessUtil pu = new ProcessUtil();
        try {
            pu.execute(cmd);
            File file = new File(System.getProperty("user.dir")
                    + "\\datas\\cypress\\videos\\examples\\main.spec.js.mp4");
            File fileToMove = new File(
                    ".\\\\datas\\\\results\\" + uitest.getTest_filename() + ".mp4");
            file.renameTo(fileToMove);
            return "success";
        } catch (Exception e) {
            return "fail";
        }
    }

И вот ProcessUtil. java

public class ProcessUtil {
    
    public static void execute(String cmd) {

        Process process = null;
        Runtime runtime = Runtime.getRuntime();
        StringBuffer successOutput = new StringBuffer();
        StringBuffer errorOutput = new StringBuffer();
        BufferedReader successBufferReader = null; 
        BufferedReader errorBufferReader = null; 
        String msg = null; 

        List<String> cmdList = new ArrayList<String>();

        if (System.getProperty("os.name").indexOf("Windows") > -1) {
            cmdList.add("cmd");
            cmdList.add("/c");
        } else {
            cmdList.add("/bin/sh");
            cmdList.add("-c");
        }
        cmdList.add(cmd);
        String[] array = cmdList.toArray(new String[cmdList.size()]);

        try {
            
            process = runtime.exec(array);
            successBufferReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));

            while ((msg = successBufferReader.readLine()) != null) {
                successOutput.append(msg + System.getProperty("line.separator"));
            }

            errorBufferReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));
            while ((msg = errorBufferReader.readLine()) != null) {
                errorOutput.append(msg + System.getProperty("line.separator"));
            }

            process.waitFor();

            if (process.exitValue() == 0) {
                System.out.println("success!");
                System.out.println(successOutput.toString());
            } else {
                System.out.println("fail...");
                System.out.println(successOutput.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                process.destroy();
                if (successBufferReader != null)
                    successBufferReader.close();
                if (errorBufferReader != null)
                    errorBufferReader.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }


}

Проблема, с которой я сталкиваюсь, заключается в том, что когда я открываю две Windows команды windows и выполняю их одновременно, она, похоже, работает нормально. Однако, когда я запускаю этот метод startTest, одновременно запрашивая мой сервер, он загружает мой процессор и оперативную память почти на 100%, и результаты казались странными. Я не очень разбираюсь в многопоточности, но думаю, мне следует выполнить команду через несколько windows (я думаю, что мои команды выполнялись в одной среде, и они разбивали друг друга ...). Пожалуйста, дайте мне несколько советов по решению этой проблемы ... Заранее благодарю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...