gpt4 book ai didi

java - 检测微服务内流程的完成情况

转载 作者:行者123 更新时间:2023-11-30 06:12:02 25 4
gpt4 key购买 nike

我有一个 Java 微服务,它会执行一个程序,然后监视 stderr 直到没有返回:

  Process p = Runtime.getRuntime().exec("/bin/sh /var/task/bin/iTMSTransporter " + commandLine);
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

logger.log("StdErr:\n");
while ((s = stdError.readLine()) != null && p.isAlive()) {
System.out.println("stderr: " + s);
if (s.indexOf("DBG-X") == -1) {
result.stdErr += s + "\n";
}
}
this.logger.log("finished reading stderr\n");

这可以有效地检测外部程序的完成情况,并且始终有效。现在外部程序已更新,它似乎开始输出 stderr,但随后停止(stderr应该有更多内容)并最终超时。 p>

然后我添加了 p.isAlive() 来 try catch 脱壳程序的完成情况。这似乎没有什么影响。现在这是令人沮丧的部分......在我的微服务的旧版本中,我使用 NodeJS 而不是 Java 来运行这个程序。 NodeJS 版本仍然通过监听 close 事件来工作:

shell.stdout.on('data', data => {
stdout += data;
});
shell.stderr.on('data', data => {
stderr += data;
});
shell.on('error', error => {
reject(error);
});
shell.on('close', () => {
resolve({
stdout: stdout,
stderr: stderr
});
});

我可以用 Java 做一些类似的事情吗?

----加法-----

我尝试了一些我在网上看到的东西:

  Runtime rt = Runtime.getRuntime();
rt.addShutdownHook(new Thread(new Runnable() {
public void run() {
System.out.println("\nGOT HERE\n");
}
}));
Process p = rt.exec("/bin/sh /var/task/bin/iTMSTransporter " + commandLine);

我想我会在新线程中检测到它并输出“GOT HERE”,但它永远不会发送到控制台。

最佳答案

如果您只是想等待该过程完成,waitFor 应该合适。

Process p = Runtime.getRuntime().exec("/bin/sh /var/task/bin/iTMSTransporter " + commandLine);
try {
p.waitFor();
// now, the process has terminated
} catch (InterruptedException e) {
// something went wrong
e.printStackTrace();
}

如果你确实想捕获输出流和错误流,这实际上有点复杂,因为你需要为此创建新线程(这并不是一个大问题,但如果你只是想知道这一点,那就太麻烦了该过程已完成)。

也可以参见process.waitFor() never returns .

关于java - 检测微服务内流程的完成情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50029350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com