从j2ee应用程序启动异步java进程的最佳方法是什么

时间:2015-01-21 08:58:06

标签: java java-ee asynchronous

我正在开发一个j2ee应用程序,我需要启动另一个可能运行大约10分钟的java进程。由于UI将超时,我必须以异步方式启动此过程。我无法使用线程,因为我必须重用现有代码,并且会在同步问题中出现问题。那么,请告诉我关于启动新异步过程的最佳方法吗?

1 个答案:

答案 0 :(得分:0)

最近,我不得不从j2ee应用程序启动java进程。

我spwaned一个新的JVM,并为运行该进程提供了所有必要的(classpatch,Main class,jvm参数,程序参数......)。

如何生成JVM方法?

public static Process createProcess(final String optionsAsString, final String workingDir, final String mainClass, final String[] arguments) throws IOException {
    String jvm = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";

    String[] options = optionsAsString.split(" ");
    List<String> command = new ArrayList<String>();
    command.add(jvm);
    command.addAll(Arrays.asList(options));
    command.add(mainClass);
    command.addAll(Arrays.asList(arguments));

    //System.out.println(command);

    ProcessBuilder processBuilder = new ProcessBuilder(command);
    processBuilder.directory(new File(workingDir));

    return processBuilder.start();
}

样本用法

public static void makeItRun() {
   try {
      // Start JVM
      String classPath = buildClassPath();
      String workingDir = getSuitableWorkingDir();//or just "."
      Process java = createProcess("-cp \"" + classPath + "\"", workingDir, my.package.APP.class.getCanonicalName(), "-the -options -of -my -APP");

      // Communicate with your APP here ...

      // Stop JVM
      java.destroy();
   } catch(Throwable t) {
      t.printStackTrace();
   }
}