gpt4 book ai didi

java - 作为非阻塞 Java 运行外部进程

转载 作者:行者123 更新时间:2023-11-28 22:43:23 26 4
gpt4 key购买 nike

我正在使用 JUnit 运行一些需要外部服务器 (tomcat) 运行的测试。我目前正在使用以下代码启动tomcat。

    Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Runtime.getRuntime().exec("{path to tomcat}/bin/startup.bat");
} catch (IOException exception) {
}
}
});
thread.setDaemon(true);

当所有测试都完成时,问题就出现了,JVM 挂起等待 tomcat 关闭。如果我手动关闭 tomcat,JVM 将按预期关闭。

有没有一种方法可以运行 tomcat,以便在所有测试完成后(所有其他线程结束)JVM 不会被阻塞并关闭?

最佳答案

在这种情况下,结束用于执行 startup.bat 批处理脚本的线程不会结束 tomcat 服务器。解决方案:


简短说明:

你需要执行shutdown.bat来停止tomcat。


详细解释:

如果您查看 startup.bat56,您会看到该脚本运行命令 call "%EXECUTABLE%"start %CMD_LINE_ARGS% %EXECUTABLE%38 行中设置:set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"。如果您查看 catalina.bat,您会发现在设置了一些标准变量并检查了参数之后,在 242 行(if ""%1""== ""start""goto doStart) 它跳转到 :doStart,它位于 279 行,对参数和设置进行一些转换_EXECJAVAstart [...] 它最终执行 %_EXECJAVA% 中的任何内容。在启动的情况下,这将涉及 start 命令。从this documentation of the start command可以看出:

Start a program, command or batch script (opens in a new window.)

所以本质上,您正在启动的进程正在执行的是运行脚本,该脚本启动另一个程序,然后结束,它会自动结束 em> 你的进程并允许线程完成。实际上你不能直接控制tomcat,你只能使用bin目录下的脚本。


结论:

因此,在程序结束时执行以下操作应该很容易(您可以使用关闭 Hook ):

    Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Runtime.getRuntime().exec("{path to tomcat}/bin/shutdown.bat");
} catch (IOException exception) {
}
}
});

所以你运行startup.bat来启动tomcat,运行shutdown.bat来结束它。

很抱歉回答一个老问题。

关于java - 作为非阻塞 Java 运行外部进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18396476/

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