Web Services 是否从Spring Web服务执行进程并监视?

30byixjq  于 2022-11-15  发布在  Spring
关注(0)|答案(2)|浏览(143)

**问题:**我想从Sping Boot 项目中的Web服务执行java jar文件,并想监视它。
**问题:**我可以执行此进程,但问题是该进程未进一步处理。

我想知道为什么这个过程是等待和为什么它没有处理。我如何可以监视它的进展。

在以下条件下处理:

1.一旦我停止了 Boot 项目或tomcat。
1.如果我移除process.waitFor();,则会行程它
我尝试了this的解决方案,即从另一个线程执行进程。

我的Web服务调用

@RequestMapping(value="/startAnalysis", method=RequestMethod.POST)
public String startAnalysis() {
    List<String> cmd = new ArrayList<>();
    cmd.add("java");
    cmd.add("-jar");
    cmd.add("test.jar");
    try {
            //Process p = Runtime.getRuntime().exec(cmd.toArray(new String[0]));

            //ProcMon procMon = new ProcMon(cmd);
            //Thread t = new Thread(procMon);
            //t.setName("procMon");
            //t.start();
            
            ProcessBuilder processBuilder = new ProcessBuilder(cmd);
            Process process = processBuilder.start();
            process.waitFor();
            
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "success";
}
pbgvytdp

pbgvytdp1#

通常,进程等待它的输出被调用进程使用。有时这仅仅意味着输出在终端上显示,但在这种情况下,你可能需要读取输入流,直到它阻塞。如果你不知道进程应该如何运行,你可能只想读取进程。getInputStream()。也有可能您的进程正在等待将某些内容写入进程。getOutputStream()在某些状态下。
您需要检查jar的文档,或者直接从命令提示符/shell执行它,看看它的行为如何,然后您可以更改应用程序,使其按照您期望的行为读取输出。
在许多应用程序中,最容易逐行读取输出:

final String EXPECTED_OUTPUT = "Hello World";

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String firstLine = reader.readLine();
if (!firstLine.equals(EXPECTED_OUTPUT)) {
    // handle unexpected situation
}
// maybe handle some more output
// or send something to the process.getOutputStream() in response
// and finally wait for the application to exit when it should be done
process.waitFor();
dfty9e19

dfty9e192#

请找到一个详细的理由,说明为什么在某些情况下,对process.waitFor()的调用根本不会返回here
或者,看看是否可以使用waitFor()方法的替代版本,其中我们提供了timeOut值。

相关问题