3

假设我有一个打包在可执行 jar 中的 java 程序,我通常使用 java -jar myappjar.jar 从命令行启动。现在我想开发远程管理应用程序来启动这个java程序,并且一旦启动我希望能够停止它,我的意思是它必须在我的程序中调用一个方法shutdown,这将完成清理工作并退出程序。

此外,当我启动远程管理应用程序本身时,它应该告诉我我要启动的程序是否已经在运行,如果是,则先停止它。

以上所有可能以及如何实现?尤其是最重要的是能够启动尚未运行的程序。

我启动的程序是一个服务器,它会一直运行直到手动或通过远程管理应用程序关闭。此服务器绝不应依赖 JMX 代理或远程管理应用程序,即远程管理应用程序/JMX 代理可以关闭,服务器程序仍继续运行,或者服务器可以手动启动,稍后可以启动远程管理应用程序来检测此服务器程序,如果如此渴望。

4

3 回答 3

4

你真正需要的是某种管理代理

管理代理是在受管节点上运行并提供管理它的接口的软件代理。它可以对节点中的托管对象执行操作,也可以将通知转发给管理器。

请看一个例​​子:

在此处输入图像描述

在您的情况下,它将是管理工具和应用程序之间的 JMX 协议。在远程主机上启动并运行代理是一个先决条件。开发一个基本的代理似乎不是一项艰巨的任务,它具有以下能力:

  • 下载/部署应用程序
  • 启动/停止应用程序
  • 监控部署的应用程序

Agent 是一个非常简单的应用程序,实现了多个命令(管理操作)。

在此处输入图像描述

有用的链接:网络管理中的代理

更新:glu代理示例

glu 是一个免费/开源的部署和监控自动化平台。Glu 正在解决以下问题:

  • 将应用程序部署(和监控)到任意大型节点集:
  • 有效率的
  • 最少/没有人际互动
  • 安全地
  • 以可重现的方式

它基于相同的原理,并且有一个代理:

glu 代理是一个活动进程,需要在需要部署应用程序的每台主机上运行。它的主要作用是运行 glu 脚本。它是部署自动化平台的核心部分,也是唯一需要的基础设施。它公开了一个 REST api 和一个命令行(在后台调用 REST api)。

随意询问您是否需要一些额外的评论。

于 2013-09-10T17:30:29.663 回答
2

也许我不太理解这个问题,但 JMX 只是用于控制您的管理应用程序,它与启动或停止应用程序的问题无关,不是吗?

基本上你可以从你的管理应用程序启动新的进程来执行java -jar myappjar.jar(例如通过Runtime.exec()) 因为你想要控制关闭,你需要一种进程间通信,以便你的管理应用程序可以关闭你的应用程序,例如通过套接字。这可以稍后用于“运行”检测。

于 2013-09-10T15:08:22.017 回答
1

Jenkins 是一个基于 java 的持续集成服务器,可以远程启动应用程序。您可以查看其源代码以获取想法。

对于基于 UNIX 机器的设置,它使用基于 SSH 的方法(可能是jsch

Jenkins 使用j-interop管理 Windows 远程处理。

于 2013-09-12T13:23:41.417 回答