【问题标题】:Execute process from spring webservice and monitor?从spring webservice执行流程并监控?
【发布时间】:2018-04-08 00:31:24
【问题描述】:

问题: 我想在 spring boot 项目中从 webservice 执行 java jar 文件。并想对其进行监控。

问题:我能够执行此过程,但问题是该过程没有进一步处理。

我想知道为什么这个进程正在等待以及为什么它没有被处理。我如何监控它的进度。

它在以下条件下得到处理:

  1. 一旦我停止了 spring boot 项目或 tomcat。
  2. 如果我删除process.waitFor();,它就会得到处理

我尝试了this的解决方案,即从另一个线程执行进程。

我的网络服务调用

@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";
}

提前致谢。

【问题讨论】:

  • 当我开始进程时,读取该进程的输入流是否重要?我注意到如果我不读它,进程会等待一些东西
  • 您是否尝试过在服务器外部从命令行运行相同的 jar 可执行文件?那么它会终止吗?

标签: java spring web-services


【解决方案1】:

进程通常会等待调用进程使用它的输出。有时这只是意味着输出会显示在终端上,但在这种情况下,您可能需要读取输入流直到它阻塞。如果您不知道进程的行为方式,您可能只想在单独的线程中读取 process.getInputStream()。在某些州,您的进程也可能正在等待将某些内容写入 process.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();

【讨论】:

    【解决方案2】:

    请详细说明为什么在某些情况下对process.waitFor() 的调用根本不会返回here

    或者,看看您是否可以使用alternate versionwaitFor() 方法,我们提供timeOut 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多