Surefire 将杀死 self fork JVM。 System.exit(0) 后退出已过去 30 秒

问题描述 投票:0回答:1

我正在使用 maven Surefire 插件(LTS 版本)在两个测试框架(例如 jUnit、jBehave)上执行测试。

尝试通过生成几个线程来实现并行化,这些线程又创建进程来执行surefire jar,从-

获取
ManagementFactory.getRuntimeMXBean().getSystemProperties().get("sun.java.command")

显示流程创建的代码片段 - CustomRunner.java

  void run() {
    ProcessBuilder processBuilder = new ProcessBuilder(commandArray);
    Map<String, String> environment = processBuilder.environment();
    environment.put("platformIndex", String.valueOf(platformIndex));
    try {
        processBuilder.inheritIO();
        Process p = processBuilder.start();
        LOGGER.info("Is Alive {} {}", p.isAlive(), LocalTime.now());
        int statusCode = p.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

EntryPoint.java

for (int i = 0; i < 3; i++) {
   Thread thread = new Thread(new CustomRunner(commandArray, String.valueOf(i)));
   thread.start();
   threadList.add(thread);
 }
threadList.forEach(thread -> {
   try {
     thread.join();
   } catch (InterruptedException e) {
     throw new RuntimeException(e);
   }
});
    
System.exit(exitcode);

在相应线程中运行两个或有时三个进程后,进程执行卡在 p.waitFor();

然后进程在 30 秒后退出,并显示错误消息 “Surefire 将杀死 self fork JVM。退出已在 System.exit(0) 后 30 秒过去。” 导致构建失败(有时不会)尽管测试已经在各自的过程中通过了。

似乎肯定的执行被卡在某些进程中。您能否让我知道可能的原因是什么以及如何缓解这种情况?尝试将 ForkedProcessTimeoutInSeconds 延长到几分钟,但没有成功。

非常感谢任何帮助。

java maven process processbuilder maven-surefire-plugin
1个回答
0
投票

根据文档,在所有守护进程关闭后,surefire会等待非守护进程关闭,但只等待30秒。看起来您正在创建非守护线程(非守护线程生成其他非守护线程)。我假设你有两个选择:

  1. 使用插件配置中的

    surefire.exitTimeout
    属性或
    <forkedProcessExitTimeoutInSeconds>
    属性增加surefire退出超时

  2. 让你的线程守护进程

    thread.setDaemon(true);

© www.soinside.com 2019 - 2024. All rights reserved.