0

我有一个独立的 Java 应用程序。目前,我正在使用启动脚本运行此 Java 应用程序,即 Windows 中的 startApplicatoin.bat 和 Linux 中的 startApplicatoin.sh ,它设置类路径,然后执行: java -classpath 。

现在我必须添加一个 stopApplication.bat 和 stopApplication.sh 脚本。这个停止脚本必须优雅地关闭/关闭这个 java 应用程序。

为此,我计划采取以下步骤:

1.当我的java 应用程序运行时,它会将启动的应用程序的进程ID 存储在一个文件中,即在一个已知文件myapplication.pid 中。

看起来 ManagementFactory.getRuntimeMXBean().getName() 调用将在 Linux 和 Windows 上工作以获取进程 ID。所以我将通过这种方式收集进程ID并将其存储在指定文件myapplication.pid中。

2.然后在运行停止应用程序脚本时,此脚本将向 myapplication.pid 文件指定的进程 ID 发出“kill”请求。

对于 Windows,我将运行“taskkill”命令来停止这个应用程序。而对于 Linux 环境,“kill”命令将用于此目的。

在我的 java 代码中,我将添加一个 addShutdownHook,它将启用我想要运行的优雅关闭操作,即在该程序停止之前我将处理我想要保留的任何东西。

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29

现在我想做一个健全性检查,以确保我的思维方式是正确的。或者有更好的方法来做到这一点。任何建议表示赞赏。并提前感谢。

4

2 回答 2

2

如果您想要“优雅”关闭,在您的长时间运行的进程中打开一个套接字并让您的“停止”脚本连接到它并发出关闭命令可能更实用(并且更容易跨平台);这甚至可以通过 JMX 实现,具体取决于您的应用程序的整体结构。“内联”而不是需要与操作系统交互的方法通常更容易推理和测试。

于 2013-08-11T13:57:38.850 回答
1

这看起来像一个Daemon.

在不使用大量脚本的情况下运行具有启动/停止功能的守护程序的最简单方法是使用jsvc。这允许您的代码使用四种方法实现接口:

  • void init(String[] arguments):这里打开配置文件,创建trace文件,创建ServerSockets, Threads
  • void start(): 启动Thread,接受传入的连接
  • void stop():通知Thread终止run(),关闭ServerSockets
  • void destroy(): 销毁任何创建的对象init()

然后,您拥有特定于平台的二进制文件来处理跟踪进程并在请求时停止它。

最有用的是 jsvc 可以作为超级用户(unix 上的 root)启动一个进程,然后将进程的拍卖运行放到一个 peon 用户。

这就是 Tomcat(例如)的工作方式,它以 root 身份启动并执行特权操作,例如绑定到端口 80。然后它下降到tomcat出于安全原因调用的 peon 使用。

于 2013-08-11T14:15:12.283 回答