如何使用JMX从管理应用程序启动java程序

时间:2013-09-08 02:34:17

标签: java jmx

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

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

以上所有可能以及如何实现这一目标?特别重要的是能够启动尚未运行的程序。

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

3 个答案:

答案 0 :(得分:4)

您实际需要的是某种Management agent

  

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

请看一个例​​子:

enter image description here

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

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

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

enter image description here

有用的链接: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)

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

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

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