优雅的方式检查外部长期jar是否成功启动

时间:2012-12-10 12:03:03

标签: java exception process jar exit-code

我正在尝试从java app执行外部jar。

检查流程是否已成功启动并运行的最佳方法是什么?

ExtApp.jar是长期运行的进程,因此我无法使用Process.waiFor(),因为它会阻止我的应用。我已经提出了以下代码,其背后的想法是exitValue()如果进程尚未终止则抛出IllegalThreadStateException

boolean success = false;
try {
    Process process = Runtime.getRuntime().exec("java -jar ExtApp.jar");
    try {
        if (process.exitValue() == 0) 
            success = true;
    } catch (IllegalThreadStateException e) {
        success = true;
    }
} catch (Exception e) {}

System.out.println(success);

但这是一种难看的解决方案。有没有更好的想法?

2 个答案:

答案 0 :(得分:2)

以上看起来非常可疑。你将产生你的过程,然后立即测试它。进程本身可能尚未确定它是否运行正常(例如,它何时实际检查jar文件eixsts /是否可加载/有效?)

我认为你最好通过新线程产生进程,通过Process.waitFor()在该线程中调用/阻塞然后通知父线程(通过任何方式 - 状态变量,wait() / notify()java.util.concurrent.Future等等。一旦流程退出,您就收集了退出状态。

Apache Commons Exec是用于执行此类工作的有用库,包括异步生成/进程退出通知。有关详细信息,请参阅DefaultExecuteResultHandler

答案 1 :(得分:2)

似乎没有优雅的解决方案。例如。我在我的电脑上运行你的代码并获得了“成功”,尽管它上面没有ExtApp.jar。也就是说,从Runtime.exec的角度来看,无论后来发生什么,进程(java.exe)都会成功启动。