检查外部长期 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:检查列表中至少一个正则表达式是不是与字符串匹配的优雅方法

JavaScript,检查嵌套对象属性是不是为空/未定义的优雅方法[重复]

NodeJs - 检查子进程是不是成功启动

检查 NFS 共享是不是在 PHP 中启动

AS2 检查是不是加载了外部文件