检查外部长期 jar 是不是启动成功的优雅方法
Posted
技术标签:
【中文标题】检查外部长期 jar 是不是启动成功的优雅方法【英文标题】:Elegant way to check whether external long-term jar launched successfully检查外部长期 jar 是否启动成功的优雅方法 【发布时间】:2012-12-10 12:03:02 【问题描述】:我正在尝试从 java 应用程序执行外部 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);
但这是一种丑陋的解决方案。有更好的想法吗?
【问题讨论】:
【参考方案1】:似乎没有优雅的解决方案。例如。尽管上面没有 ExtApp.jar,但我在我的 PC 上运行了您的代码并获得了“成功”。也就是说,从 Runtime.exec 的角度来看,进程 (java.exe) 成功启动,无论之后发生什么。
【讨论】:
你是对的。有时间问题。如果使用调试器检查代码并且 ExtApp.jar 不存在,则显示false
,如果不是从调试器运行,则显示true
。
对,这就是我的意思,时机,时机并不优雅,因为你永远不知道要等多久才能做出决定【参考方案2】:
以上看起来很可疑。您将生成您的流程,然后立即对其进行测试。进程本身可能无法确定它是否运行正常(例如,它何时实际检查 jar 文件 eixsts/是否可加载/是否有效?)
我认为你最好通过一个新线程生成进程,通过Process.waitFor()
在该线程中调用/阻塞,然后通知父线程(通过任何方式 - 状态变量,wait()
/notify()
, java.util.concurrent.Future
等)一旦进程退出并且您已经收集了退出状态。
Apache Commons Exec 是一个用于执行此类工作的有用库,包括异步生成/进程退出通知。请参阅DefaultExecuteResultHandler 了解更多信息。
【讨论】:
这是一个长期的过程,不会退出。以上是关于检查外部长期 jar 是不是启动成功的优雅方法的主要内容,如果未能解决你的问题,请参考以下文章
Python:检查列表中至少一个正则表达式是不是与字符串匹配的优雅方法