我遇到了有关Process和Threads的问题。我的情景是:
我的Java应用程序,称之为'Starter-App',在名为ProcessBuilder
的{{1}}内启动另一个带有Thread
的exe应用程序(Diagnosis.exe):
Thread startGXThread = new Thread(new Runnable() {
@Override
public void run() {
try {
...
File gxExe = new File(pathToGX); // Path to Diagnosis.exe
gxp = pb.start();
gxp.waitFor();
} catch (IOException e) {
LOG.error("Can't start module");
LOG.error(e.getMessage(), e);
} catch (InterruptedException e) {
LOG.debug("thread interrupted. Destroy process");
LOG.debug(e.getMessage(), e);
if (gxp != null) {
gxp.destroy();
LOG.debug("process exit value: " + gxp.exitValue());
}
}
}
}, "diag_thrd");
然后使用webapp启动jetty webserver(ServiceWebApp)。
一旦铬关闭'Starter-App'识别出这一点并停止jetty并终止startet应用程序.Diagnosis.exe。这可以通过以下方式完成:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
stopAsync();
}
});
public static void stopAsync() {
Thread diag = getThread("diag_thrd");
if (diag != null) {
diag.interrupt();
}
if (gxp != null) {
gxp.destroy();
LOG.debug("process exit value: " + gxp.exitValue());
}
}
问题: 我需要能够从webapp中停止startet Diagnosis.exe并再次启动它,同时仍然能够在“Starter-App”中停止Chrome后销毁/关闭Diagnosis.exe。 我希望我能解释我的问题并希望得到建议。
答案 0 :(得分:2)
在Anands回答的基础上,我认为您需要在Diagnosis.exe和Starter-App之间使用某种形式的IPC,使用websockets或许多其他选项来表达某些想法:How to have 2 JVMs talk to one another。
webapp会向Starter-App发送重新启动Diagnosis.exe的请求,Starter-App将始终负责管理应用程序三人组。
答案 1 :(得分:1)
我认为有一个解决方案,但实施起来却很棘手。
您可以随时使用* {iix api',如ps kill #pid
中所示Killing a process using Java
但您的网络服务器必须知道要查找哪个PID。我看到实现这种事情的唯一选择是使用套接字或Web服务。因此,您要跟踪Diagnosis.exe进程的当前pid是什么,并在杀死之前使用该ID。