1

我几乎没有 24/7 运行的 java 应用程序。我想编写另一个 java 应用程序,它检查这些应用程序是否崩溃。如果某个应用程序崩溃了,我想重新启动它。有什么解决方案吗?

4

5 回答 5

2

我看到了一些方法,但应该有更好的方法来做到这一点:

  1. 如果您可以控制正在运行的应用程序,您可以让它们中的每一个监听机器上的给定端口并回复任何请求。然后,您可以简单地 ping 该端口以查看应用程序是否正在运行。

  2. 如果您自己启动应用程序,您可以存储它们的 pid,然后检查具有该 pid 的进程是否仍然存在。

  3. 每个应用程序都可以创建一个文件并定期更新它。然后您的监控应用程序可以检查文件是否已更新。如果没有,那么应用程序就死了。

于 2012-04-24T07:01:05.827 回答
0

我能想到的是您可以在那些 24/7 运行的程序中定义一个新的自定义异常,将该异常添加到您认为可能发生崩溃的块中,然后在崩溃调用此异常时调用另一个 java 应用程序的某些方法.

于 2012-04-24T07:00:58.107 回答
0

您可以使用 wmic 实用程序。像这样 :Process proc = Runtime.getRuntime().exec("wmic.exe");

然后您可以检查与您的 java 应用程序 (javaw.exe) 应用程序关联的不同参数。

于 2012-04-24T07:04:06.827 回答
0

您也许可以使用 ( http://quartz-scheduler.org/ ) Quartz 调度程序或 java.util.Timer api 来定期唤醒并检查进程。每当您运行该进程时,我相信您可以获得可以存储的 PID 或进程 ID。定期唤醒并调用 shell 脚本来检查进程是否正在运行。如果没有,则使用 Runtime.getRuntime() 生成新进程

于 2012-04-24T07:07:06.793 回答
0

如果您可以使用简单的解决方案,您的应用程序必须从应用程序的核心功能内部更新外部资源。如果外部资源有一段时间没有更新,你就知道你的应用程序的核心已经停止了。

如果您使用单独的线程来更新资源,您的核心功能将会崩溃,但线程会继续运行并且您什么也检测不到。

外部资源可以是文件。在那里写下当前的时间戳。如果时间戳有一段时间没有更新,那么应用程序已经崩溃。或者,如果您的监视器在单独的机器上以检测硬件崩溃,则写入网络套接字(如果监视器与您的应用程序一起崩溃,它就毫无用处)。

您的监视器必须知道 Java 进程的进程标识符,以便它可以在需要时杀死它并重新启动它。如果从 shell 脚本启动应用程序,则可以将进程标识符写入文件。

有一个十亿美元的产业生产这种软件监视器。这不是一项微不足道的任务。

于 2012-04-24T10:28:11.533 回答