使用使用JMX设计模式进行应用程序管理设计设计模式进行应用程序管理设计
火龙果软件工程技术中心
Java 管理扩展 ( JMX ) 技术是 Java 2 平台的标准版 ( J2SE ) 5 和企业版 ( J2EE ) 的重要组成部分。现在,与 J2EE
兼容的应用服务器需要支持这个标准,因为其中一些服务器使用 JMX MBean 作为基础架构。设计模式自从开始引入以来就一
直很受欢迎,现在,我们还可以把这些设计理念用于应用程序的易管理性设计中。
为了使应用程序在生产过程中更易于管理,我们将结合 JMX 和记录的使用,对整套设计模式进行介绍,同时将这些策略外延
到代码中。这部分应用程序对架构师来说非常重要,因为大多数应用程序的生命周期仅限于部署阶段。为了使操作人员能够对
应用程序进行有效的监控和管理,有必要对应用程序进行控制和可视化操作。现在,对于某些因为其他目的而继续使用较传统
的记录的动态要求来说,使用 JMX 来操纵应用程序是监控和管理应用程序的最佳方法。
您可以构建自己的自定义 MBean , 它将与应用服务器一起提供的 MBean 或 Java 虚拟机 ( JVM ) 提供的 MBean 一起使
用。当应用程序的内部工作的可管理性需求高于应用程序的内部对象和属性的可视性需求时,使用这种组合是最好的做法。从
应用程序中将消息记录到文件或其他目标文件中是一种常用技术,该技术为操作人员提供了对运行产品的某种程度的监控。记
录消息是一种跟踪发生在应用程序内部的异常情况或静态错误(包括从指示性错误到致命性错误)的有效方法。记录是让管理
人员了解应用程序内部情况的基本办法。
但是,对于高速变化的应用程序性能数据(即测量应用程序的整体性能的数据)来说,日志文件并不适合。例如,由于登录人
数无时无刻不在变化,不可能为每一位登录系统的用户都提供新的日志消息。
数据捕获数据捕获
较好的办法是先将这些不断变化的数据收集到一个对象中 ,即 JMX MBean 中,然后定期将这些数据从 MBean 收集到一个管
理工具中。例如,可使用该技术捕获系统进程中事务的数量,或者捕获包含等待处理的请求的那个队列的长度。通过把要处理
的业务事务的数量与队列中等候处理的事务数进行比较,就可以了解应用程序的运行状况。
以这种方式使用 MBean 是使用 JMX 的最佳实践之一。 MBean 是计算因管理应用程序而可视的那些项的数量的一个好工具。
随着时间的推移,这些从 MBean 中收集来的数据最后还可以绘成图形,用来表示相关的性能,或者表示应用程序的其他度量
标准之一。 JMX MBean 还可用于统计不变的数据,例如警告、异常或者错误消息,但这些不是它的主要用途。
在编写适用于 JMX 模型的代码时应考虑到一些问题。在此,需要考虑的问题是:该模型的哪些方面经常变化?
1. 创建 MBean 对象的目的是为实现应用程序的可管理性提供数据源和控制点。业务对象本身也可以实现或继承适当的
MBean 接口,使自己成为一个拥有自身权利的 MBean ,这一过程包括创建一个业务对象,因此,要严格遵守 Standard
MBean (即 DynamicMBean ) 接口的规则。 ( 关于这些 MBean 接口规则的更多信息。 )
2. MBean 对象在向 MBean 服务器注册之后才能使用。其中, MBean 服务器是应用服务器的一个组成部分,或者是 JVM
进程 的一个组成部分。
3. MBean 在注册时使用的名称是一串单独的字符串,扮演 MBean 客户角色 的其他所有对象都必须使用该字符串,以便这
些对象被正确找到。
4. MBean 对象通过向 MBean Server 提供 MBean 名称和 MBean 上某一方法的名称(二者都以字符串的形式提供的),
来调用 MBean 上的方法,并请求 MBean Server
调用
MBean 上的这个方法。
5. 在某些时候, MBean 还会发出通知,以确定是否出现某些条件。
现在我们已经对将 JMX 用于可管理性有了一个总的看法,下面让我们来分析一下这些模式的特殊用途。很明显,将基于字符
串的名称用于散布在整个应用程序中的对象和方法是一种趋势。这些名称经常发生变化并产生错误;因此,我们应该以某种模
式封装它们,这也正是开发 MBeanHelper 模式的动力所在。
MBeanHelper
MBeanHelper 模式可以简化从使用 MBean 的 对象访问 MBean 的过程 ( 参见 图 1 ) 。该模式可以加强业务对象和相关
MBean 之间的联系。二者之间的联系基于两个字符串的需求,一个字符串用于对象名称,另一个字符串用于方法调用及其参
数。这些字符串会破坏我们试图在对象之间维护的强类型( strong typing )。将使用的 MBean 的名称封装在 Helper 类中。
将调用的方法名称也通过使用一个强类型接口封装在 MBeanHelper 类中,以便提供编辑时类型检查。 Helper 类对客户隐藏
了用来在 MBean 服务器中搜寻 MBean 的所有代码。
图 1 : MBeanHelper 模式
MBeanHelper 模式可以简化从使用 MBean 的 对象访问 MBean 的过程 , 并加强业务对象与相关 MBean 之间的联系。
在应用程序中构建可管理性的一个重要方法是创建一个或多个业务对象,这样就可以让它们将重要数据写入 JMX MBean 中。
但是,我们不想在这些业务对象的逻辑中加入太多特定于 JMX 的代码。我们想使指令变得简洁一些,对 JMX MBean 调用一