发表于

Oracle Magazine
2004年5/6月号
开发人员: 趋势

利用JMX来监视、控制和扩展应用程序的功能
作者:Cameron O'Rourke

利用Java管理扩展(JMX)来改进应用程序的功能。

JMX(Java Management Extensions)是新近被添加到Java平台的最有趣的特性之一,但是还没有引起人们的足够重视。JMX的目标是为监视、控制Java应用程序提供一个标准的接口。 但是JMX体系结构非常灵活,它能够做到的远不止这些。JMX已开始出现在Oracle产品(参见下一部分)和其他第三方的产品中。在本文,我将解释JMX的基本概念以及它如何帮助你构建更优秀的Java应用程序。

基本概念

JMC框架可以通过让你看见并且调整程序内部的运行状况,来提高你的应用程序的易管理性。

  • 可以监视你的应用程序中的重大事件、性能问题、出错条件和统计数字。比如说,如果通信量急剧增长或者性能显著下降,则你都会得到及时的通知。
  • 通过直接展示应用程序API和参数可以使你的应用程序在运行时变得更可控制、更可调整。比如说,可以将数据库连接切换到一个替代服务器上,或者也可以改变显示给每一个请求的行数。
  • 可以在应用程序运行时或者在该应用程序内调用调试函数时,无须关闭该应用程序,就可以在程序中修改调试的等级和日志。
  • 可以将JMX与硬件、数据库和应用服务器接口,来监视你的基础设施的状况和性能。

通过模块化的插件"管理Bean(Mbean)",你能够洞察你的应用程序和基础设施。Mbean与应用程序、组件(比如EJB)或者其他资源集成,以便显示各种属性(值)和操作。管理型应用程序(某些时候特指客户端或者终端控制台)能够看到和修改这些属性和调用各种操作。

Mbean本身是在Mbean服务器中被管理。Mbean服务器负责跟踪正在运行的Mbean,并且提供访问它们的统一方式。Mbean永远不能被直接调用;所有的请求都必须通过Mbean服务器来执行。一个JMX Agent(代理)其实是Java进程,后者包括Mbean服务器,并且提供其他JMX服务,诸如定时器、类装载器和协议适配器。JMX Agent可以独立运行,也可以成为其他程序(比如应用服务器)的一部分。

一个简单示例

让我们来看一个极其简单却很有用的例子。我们想要监视一个网站,以便知道它是在正常运行,它在周期性地发送对主页的请求。我们需要能够配置网站的地址和请求的时间间隔,并且通过HTTP状态代码来获取网站的状况(OK, WARNING, ERROR还是UNKNOWN)。

我们将创建一个Mbean来实现该功能,并将其命名为SiteMonitor。创建该类型的Mbean的规则非常简单:Mbean必须实现相应的Mbean接口,必须具有一个公共构造器,并且必须是一个公共的、具体的类。

开发我们的SiteMonitor Mbean的第一个步骤就是编写其Java接口,该接口被称之为SiteMonitorMBea。该接口描述通过Mbean服务器提供Mbean的一些方法。如代码清单1所示,它声明了四种属性和两种操作。"Mbean"后缀很重要,它告知JMX Agent该接口描述了一个Mbean。

下一个步骤,我们编写一个实现SiteMonitorMBean接口的Java类。SiteMonitor类允许管理控制台修改Interval和SiteAddress属性,并且允许一个监视线程启动和停止。当该监视线程运行的时候,它只简单地将HTTP HEAD请求发送到Web服务器,阅读HTTP响应代码,然后在一段规定的时间休息。该SiteMonitor类如代码清单2所示。

JMX引用的实现包括一个HTML适配器,因此我们可以通过任意的Web浏览器连接到JMX Agent。通过使用HTML接口,我们可以监视和控制JMX Agent以及注册的Mbean。

在该监视器运行过程中,我们可以修改SiteAddress,然后,Mbean就可以监视新的地址。值得注意的是该修改过程无需停止和重起程序就可以完成。

那么到现在为止,我们已经完成了什么呢?

我们已经创建了一个简单的管理组件,可以从任意其他的程序(包括任意JMX管理控制台)对它进行监视和控制。JMX Mbean服务器可以对任意数目的Mbean进行实例化,因此我们可以在同一时间运行多个SiteMonitor。

组件对外部公开并且可以在运行时被实时地配置,这极大地提升了它的价值。如果Mbean的代码编写正确,那么它可以一直运行,永远无需重新启动。

JMX Agent还提供其他服务,诸如通知、定时器、关系服务以及从XML文件动态载入Mbean。Mbean可以利用这些服务进行协作,并且将他们合并起来构成更加复杂的管理方案。

这种动态载入的能力和松散耦合的组件提供了极大的灵活性。接下来,我们来看看对JMX的不同使用方式。

利用JMX构建应用程序

Mbean有多种与应用程序和Mbean之间进行交互的方式。如果你在编写一个新的应用程序,那么与把Mbean集成到现有应用程序相比,显然你可以获得更大的灵活性。图1 显示了用JMX构建应用程序的四种方式。

Figure 1

图1: 利用JMX构建应用程序的不同方式

  1. 现在尝试利用已有的应用程序。必须通过使用任何可用的接口来与你的MBean进行通讯。这也许意味着能够使用已有的API、可以深入到基础数据库表、或者只是访问屏幕内容和模拟一个用户。所带来的好处就是你可以用一种统一的而又灵活的方式管理你的应用程序。
  2. 如果你可以访问源代码,那么意味着你拥有更多的选择。你的Mbean可以对该应用程序进行更好的监视和控制。在第二种情况下,可以从JMX Agent内部启动应用程序,并且使用已有的API或者使用你新创建的API ,Mbean可以与各种不同的系统组件交互。
  3. 如果你在构建一个新的系统,那么你可以将其创建为一套Mbean,并且让Mbean服务器管理你的系统的运行生命周期。我认为这是JMX最令人激动的特性。在这种情况下,对于应用程序来说,Mbean服务器充当一个框架的角色,从而提供了一个非常灵活且机具可控制的体系结构。在必要的时候,你可以添加、修改或者替换组件,并且在运行时间将它们结合在一起。某些开放源代码项目采用了这样的方式。
  4. 如果你有一个分布式系统,则你也许需要在不同的主机上部署Mbeans。一些JMX实现,诸如MX4J,提供了一个代理Mbean,它可以将远程Mbean暴露出来以便于本地管理之下。

Oracle对JMX的支持
下一步

阅读有关JMX的文档,下载JMX1.2.1的参考实现

下载
本文的示例代码

Oracle JMX常见问题解答应用程序

Oracle OC4J 10.0.3 Developer 预览版

Oracle参与制定了JSR-77。JSR-77定义了通过JMX来管理Java 2平台、J2EE应用服务器的方式。Oracle应用服务器会暴露JMX Agent,而Oracle企业管理器会提供一种一般的Mbean浏览器,使客户能够管理定制的Mbean。

OC4J 10.0.3 Developer预览版可以从Oracle技术网络(OTN)上得到,使用户可以预先查看这种支持。如果你在本地机器安装OC4J,则可以通过在浏览器中输入http://localhost:8888/ adminoc4j来访问JMX控制台。你也可以将自己的Mbeans部署到OC4J ;为了将SiteMonitor Mbean部署到OC4J 10.0.3,可按照以下步骤进行:

1.将Mbean类和接口封装到JAR文件中并将其拷贝到<OC4J_ home>/j2ee/home/applib 目录。

2.通过下列代码添加到j2ee/home/ config/application.xml文件中,来将有关该Mbean的信息通知OC4J:

<jmx-mbean 
objectname= ":name=SiteMonitor"    class="devtrends.jmxping.SiteMonitor">
  <description>Pings Web Sites
  </description>
</jmx-mbean>

3. 重新启动 OC4J.

用于Oracle developers的JMX实现是:(1) 开发人员可以创建监视和控制OC4J的应用程序;(2) 开发人员可以创建插件以管理其自己的应用程序;(3)开发人员可以通过新的、集成的服务来增强OC4J的功能。

本文的示例代码可在DevTrends站点上找到(参见下一步)。欲了解更多,请从OTN下载Oracle JMX FAQ示范。


Cameron O'Rourke (cameron.orourke@oracle.com) 自1992年以来一直是Oracle的技术专家。

E-mail this page