关闭分叉的 JVM
嵌入式关机
测试集完成后,将执行java.lang.System.exit(0)启动关闭挂钩的进程。此时该进程可能会运行下一个 30 秒,直到所有非守护线程终止。经过一段时间后,该进程将自行终止java.lang.Runtime.halt(0)。可以通过配置参数自定义 30 秒的超时时间forkedProcessExitTimeoutInSeconds。
Ping 分叉的 JVM
由于 Surefire 插件 2.20.1 ping 依赖于平台,如果无法识别 Maven 进程或平台的 PID,则会回退到旧机制,因此 Java 中的本机命令会失败。
只需该机制检查它 Maven PID 是否仍然存在,并且操作系统不会在另一个应用程序中重用它。如果 Maven 进程已经死亡,则分叉的 JVM 将被杀死。
实施:取决于 Maven PID :
- Java 9 调用
ProcessHandle.current().pid(),或 /proc/self/stat在 Linux 和/proc/curproc/statusBSD上解析 PID ,或- JMX 调用
ManagementFactory.getRuntimeMXBean().getName()。
在类 Unix 系统上,进程的正常运行时间由 native command 确定 (/usr)/bin/ps -o etime= -p [PID] 。
在 Windows 上,开始时间是 wmic process where (ProcessId=[PID]) get CreationDate 在分叉的 JVM 中确定的。
自 Surefire Plugin 2.19 起,旧机制明显变慢:
主进程每 10 秒向分叉的 JVM 发送 NOOP 命令。分叉的 JVM 每 20 秒等待一次命令(自 2.20.1 版起更改为 30 秒,请参阅SUREFIRE-1302)。如果主进程被杀死(收到 SIGKILL 信号)或关闭(按 CTRL+C,收到 SIGTERM 信号),则分叉的 JVM 在超时等待期后被杀死。
注意:在版本之后,必须通过将配置参数设置为或3.0.0-M4来启用此功能。enableProcessCheckerpingall
通过停止构建来关闭分叉的 JVM
通过发送 SIGTERM 信号或按 CTRL+C 关闭构建的主进程后,主进程立即向每个分叉的 JVM 发送 SHUTDOWN 命令。默认情况下(配置参数shutdown=testset)分叉的 JVM 不会选择新的测试,这意味着当前的测试可能仍会继续运行。SIGTERM 信号触发在分叉的 JVM 中执行的 Java shutdownhook java.lang.Process.destroy()(取决于 VM 和 OS,并不总是可靠)。该参数shutdown可以配置其他两个值exit和kill。在主进程收到 SIGTERM 后执行使用exit分叉的 JVM 。java.lang.System.exit(1)使用killJVM 执行java.lang.Runtime.halt(1),例如:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<shutdown>kill</shutdown>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
注意:在版本之后,必须通过将配置参数设置为or或3.0.0-M4来启用此功能。enableProcessCheckerpingnativeall
在特定超时后关闭分叉 JVM
forkedProcessTimeoutInSeconds在每个单独的进程经过一定时间后,使用参数分叉的 JVM 将被单独杀死,并且整个插件失败并显示错误消息:
There was a timeout in the fork
崩溃的分叉 JVM 导致列出崩溃的测试
在 JVM 突然退出后,Crashed tests:如果整个测试集尚未完成,控制台会列出带有崩溃测试列表的消息。如果测试退出、终止 JVM 或分段错误使 JVM 崩溃,就会发生这种情况。在这种情况下,您可能会对报告目录中生成的转储文件感兴趣,请参阅常见问题解答。



