假设我有一个打包在可执行jar中的java程序,我通常使用java -jar myappjar.jar从命令行开始。现在我想开发远程管理应用程序来启动这个java程序,并且一旦启动我希望能够阻止它,我的意思是它必须在我的程序中调用一个方法shutdown,它将清理工作并退出程序。 / p>
当我启动远程管理应用程序本身时,它应该告诉我我要启动的程序是否已经运行,如果是,则先停止它。
以上所有可能以及如何实现这一目标?特别重要的是能够启动尚未运行的程序。
我启动的程序是一个永远运行的服务器,直到手动或通过远程管理应用程序关闭。此服务器绝不应依赖于JMX代理程序或远程管理应用程序,即远程管理应用程序/ JMX代理程序可以关闭,服务器程序仍然保持运行或服务器可以手动启动,以后可以启动远程管理应用程序来检测此服务器程序如此渴望。
答案 0 :(得分:4)
您实际需要的是某种Management agent:
管理代理是在受管节点上运行的软件代理 并提供管理它的界面。它可以 对节点中的托管对象执行操作,也可以转发 通知经理。
请看一个例子:
在您的情况下,它将是管理工具和应用程序之间的JMX协议。在远程主机上启动并运行代理是一个先决条件。开发基本代理似乎不是一项艰巨的任务,具备以下条件:
代理是一个非常简单的应用程序,它实现了几个命令(管理操作)。
有用的链接:Agents in Network Management
更新:glu代理商示例
glu是一个免费/开源的部署和监控自动化平台。 Glu解决了以下问题:
- 将应用程序部署(和监视)到任意大型节点集:
- 有效地
- 最少/无人为互动
- 安全
- 以可重复的方式
它基于相同的原则,并在其中有一个代理:
glu agent是一个需要在每台主机上运行的活动进程 需要部署应用程序的位置。它的主要作用是运行glu 脚本。它是部署自动化平台的核心部分 并且是唯一必需的基础设施。它公开了一个REST api和命令行(在封面下调用REST api)。
随意询问您是否需要一些额外的评论。
答案 1 :(得分:2)
也许我不太了解这个问题,但是JMX只是用来控制您的管理应用程序,它与启动或停止应用程序的问题无关,不是吗?
基本上,您可以从管理应用程序中启动新Process以执行java -jar myappjar.jar
(例如,通过Runtime.exec()
)
由于您需要受控关闭,因此您需要进行一些进程间通信,以便管理应用程序可以关闭您的应用程序,例如:通过套接字。这可以在以后用于“运行”检测。
答案 2 :(得分:1)