为您的 Web 应用建立基于 JMX 的管理系统
Web 应用系统总算开发了,接下来该如何让客户(Web 应用系统的管理员)轻松管理我的一堆配置文件,或者如何实现动态修改系统运行属性,同时又让客户不需要过多的了解配置文件的内容就能够实现这些管理呢?这是许多刚刚结束 Web 应用系统前期开发的系统分析人员需要面临的问题。又或者说我想对早已完成 Web 应用系统进行有效的资源管理,希望再添加管理功能的同时,对原有的代码不需要做过多的修改,换句话说就是管理系统与被管理的应用系统做到很好的隔离。JMX 的管理框架(图 1)为你很好的解决了这些问题。

JMX(Java Management Extensions) 是来管理网络,设备,应用程序等资源,它描述了一个可扩展的管理体系结构,并且提供了 JMX API 和一些预定义的 java 管理服务。在撰写本文时,JMX 规范最新版本为 v1.2( http://jcp.org/aboutJava/communityprocess/final/jsr003/index3.html) ,JMX 参考实现的最新版本为 v1.2.1( http://java.sun.com/products/JavaManagement/)。JMX 推出后,一些大型的项目就立即采用了基于 JMX 的实现框架,例如 Jakarta tomcat 和 JBoss,这充分说明 JMX 的可行性和良好的特性。
对于 Web 应用的管理往往是比较麻烦的,例如客户手动的修改配置文件,开启数据库监控程序等等,如果要动态修改数据库访问方案或者监控用户数,动态修改日志级别会更加麻烦,并且可能把系统的结构弄得凌乱,造成结构不良的恶果,更别说可扩展性了。JMX 的分层结构以及高度的组件化,通过将各种资源封装成 MBean 的方式,让我们可以很低成本的实现对现有 Web 应用的扩展性很强的管理方案。
本文以 Tomcat 作为 Web 服务器为例,详细的介绍如何使用 JMX 建立对 Web 应用的管理。对于 JMX 的概念性的东西、体系结构以及使用规范已经有不少的相关文档,为了能够更好的理解本文,在阅读本文时请先参阅这些文档,本文的笔墨将着重在应用和实现上。下图(图 2)为 JMX 的基本框架图(见 JMX 规范),目的是给大家理解本文提供方便。

?
2. 通过 JMX API 中 MBeanServerFactory 类的 createMbeanServer() 的方法创建 MBeanServer 的实例,这样做得好处的使 JMX 的实现与 Web 服务器无关,使代码的移植性更强。在创建完 MBeanServer 以后,为了让能够在管理系统中很方便的获得该 MBeanServer 的引用,可将其置入 application 变量中 ( 推荐 ),或者使用 singleton 设计模式的方法创建和获得。
使用 JMX API 创建 MBean Server 的代码如下:
http://jakarta.apache.org/tomcat/tomcat-4.1-doc/mbeans-descriptor-howto.html")。<mbean-list> <mbean name="JDBCConfigMBean" className="com.myApp.jmx.JDBCConfigMBean" description="the object to access database" domain="myapp"> <attribute name="driver" description="Jdbc driver name" type="java.lang.String" writeable="false"/> <attribute name="dburl" description="database url" type="java.lang.String"/> <attribute name="username" description="Database user name" type="java.lang.String"/> <attribute name="password" description="vthe user name's password" type="java.lang.String"/> <operation name="save" description="save the configuration" impact="ACTION" returnType="java.lang.String"> </operation> </mbean> <mbean name="DBAccess" className="com.myApp.jmx.ResInstanceMBean" description="the object to access database" domain="myapp" type="com.myApp.db.DBAccess"> <attribute name="driver" description="Jdbc driver name" type="java.lang.String" writeable="false"/> <attribute name="dburl" description="database url" type="java.lang.String"/> <attribute name="username" description="Database user name" type="java.lang.String"/> <attribute name="password" description="vthe user name's password" type="java.lang.String"/> <operation name="testConnection" description="test configure attribute" impact="ACTION" returnType="java.lang.String"> <parameter name="driver" description="Jdbc driver name for test" type="java.lang.String"/> <parameter name="username" description="Database user name for test" type="java.lang.String"/> <parameter name="password" description="the user name's password for test" type="java.lang.String"/> <parameter name="dburl" description="database url for test" type="java.lang.String"/> </operation> </mbean> </mbean-list>
?
回页首
注册 MBean
在对 MBean 注册前,必须得到 MBean 的描述信息,并且保存在 MBeanInfo 的实例中,否则是无法将 MBean 注册到 MBean Server 当中的,通过 MBean 描述文件,获得各种类型 MBean 的描述信息是一件非常简单的事情,而这些正是创建 MBean 所需要的,这样做的优点在于不需要通过编写代码,只需要修改描述文件,就可以添加新的 MBean,注册的代码实际上我们之前的代码已经列出。在 MBean 注册时必须指定对应的 ObjectName,ObjectName 相当于 MBean 在 MBean Server 中的唯一名字,它的格式为:"domain:key1=value1,key2=value2...",可根据系统的要求定义一套命名的规则。
// 注册 mbean 到 MBean Server 中 MBeanServer serv = getMBeanServer(); ObjectName oname = createObjectName(mbean); serv.registerMBean(mbean, oname);
?
回页首
编写管理框架的客户端
我们已经完成了服务器端 MBean 的注册工作,接下来是如何让用户能够使用这些 MBean 管理资源。虽然 JMX 的参考实现中提供了 HTMLAdapter,使用户能够通过浏览器使用 MBean。但是提供的界面并不是那么友好可亲,一向苛刻的客户对这绝对不会满意的。因此,编写一些简洁的访问 MBean 页面还是有必要的。如何通过 java 访问 MBean,可以参阅 JMX 的资料,这些资料非常多。
根据上面的介绍,如果要增加对 Web 应用的管理功能或管理系统,基于 JMX 的管理框架绝对是一个非常明智的选择。