我有很少的java应用程序全天候运行。我想编写另一个java应用程序,它检查是否有任何这些应用程序崩溃。如果某个应用程序崩溃我想重新启动它。对此有什么解决方案吗?
答案 0 :(得分:2)
我看到了一些方法,但应该有更好的方法:
如果您可以控制正在运行的应用程序,则可以让每个应用程序监听计算机上的给定端口并回复其上的任何请求。然后,您只需ping该端口即可查看该应用是否正在运行。
如果您自己启动应用程序,则可以存储其pid,然后检查具有该pid的进程是否仍然存在。
每个应用都可以创建文件并定期更新。然后您的监控应用程序可以检查文件是否已更新。如果没有,那么该应用已经死了。
答案 1 :(得分:0)
我能想到的是你可以在那些24/7正在运行的程序中定义一个新的自定义异常,将该异常添加到你认为可能发生崩溃的块中,然后在调用此异常时调用另一个java应用程序的某个方法崩溃。
答案 2 :(得分:0)
您可以使用wmic实用程序。
像这样:Process proc = Runtime.getRuntime().exec("wmic.exe");
然后,您可以检查与您的Java应用程序(javaw.exe)应用程序相关联的不同参数。
答案 3 :(得分:0)
您也许可以使用(http://quartz-scheduler.org/)Quartz调度程序或java.util.Timer api来循环唤醒。并检查进程。有时候你运行这个过程我相信你可以获得可以存储的PID或进程ID。 定期唤醒并调用shell sript来检查进程是否正在运行。如果没有,则使用Runtime.getRuntime()
生成新进程答案 4 :(得分:0)
如果您可以使用简单的解决方案,您的应用程序必须从应用程序的核心功能内部更新外部资源。如果外部资源暂时不更新,您就知道应用程序的核心已停止。
如果您使用单独的线程来更新资源,您的核心功能将崩溃,但线程会继续运行而您什么都不会检测到。
外部资源可以是文件。在那里写下当前时间戳。如果时间戳没有更新一段时间,那么应用程序已崩溃。如果您的显示器位于单独的计算机上以检测硬件崩溃,则写入网络套接字(如果显示器与您的应用程序崩溃,则显示器非常无用。)
您的监视器必须知道Java进程的进程标识符,以便它可以终止它并在需要时重新启动它。如果从shell脚本启动应用程序,则可以将进程标识符写入文件。
有一个十亿美元的行业生产这种软件监视器。这不是一项微不足道的任务。