📄 part code.txt
字号:
一.创建Web应用的管理系统
对Web应用构建一个基于JMX的管理系统,我们需要做的事情有哪些呢?
1.针对每一个需要管理的资源创建一个MBean的实例,这是JMX框架所要求的,有两种类型的实例可供选择,一种是直接管理资源的MBean,一种通过调用资源实例进行管理的MBean。
2. 编写一个MBean描述文件,并描述每一个MBean,选择基于XML的MBean描述文件是一个不错的决定。
3. 通过读MBean描述文件,生成MBeanInfo,从而生成一个个MBean。
4. 将需要进行管理的MBean注册到MBean Server当中。
5. 编写客户端代码,选择Web的方式进行客户端的编码比较Web应用的风格,也比较容易实现。
那么一个基于JMX的Web应用的管理框架已经成形,图3是它的基本结构图,虚线部分为基于JMX的管理系统。接下来我们按照步骤实现整个管理系统。
二.获得MBeanServer的实例
有两种方案获得MBeanServer的实例:
1.通过获得Web服务器的MBeanServer的实例,这样做的好处是通过该MBeanServer对本身,甚至可以实现对Web服务器的自身的一些管理。
2.通过JMX API中MBeanServerFactory类的createMbeanServer()的方法创建MBeanServer的实例,这样做得好处的使JMX的实现与Web服务器无关,使代码的移植性更强。在创建完MBeanServer以后,为了让能够在管理系统中很方便的获得该MBeanServer的引用,可将其置入application变量中(推荐),或者使用singleton设计模式的方法创建和获得。
使用JMX API创建MBean Server的代码如下:
MBeanServer server = MBeanServerFactory.createMBeanServer();
}
}
}
}
//getter and setter
......}
第二段代码是一个Model MBean类,和前面提到的第一个Model MBean一样,继承了BaseModelMBean,不同的是它将拥有Web应用运行时期资源实例的引用,因为所有的属性和方法都在所引用的资源实例中,父类BaseModelMBean完成了通过反射调用该资源实例对应的属性设置方法,所以这个类的编写相当简单,我们可以在里面完成其他一些相关的方法。
package com.myApp.db;
import org.apache.commons.modeler.BaseModelMBean;
import javax.management.MBeanException;
import javax.management.RuntimeOperationsException;
public class ResInstanceMBean extends BaseModelMBean {
public ResInstanceMBean ()
throws MBeanException, RuntimeOperationsException {
super();
}
/** other operations **/
.....
}/**Web应用运行初期创建的数据库连接**/
DBAccess dbAccess = new DBAccess();
dbAccess.setDriver();
dbAccess.setPassword();
dbAccess.setUsername();
dbAccess.setDburl();
......
ResInstanceMBean mbean= new ResInstanceMBean();
mbean.setModelMBeanInfo(createMBeanInfo());
DBAccess instance = getDBAccess();
mbean.setManagedResource(instance, "objectReference");
MBeanServer serv = getMBeanServer();
ObjectName oname = createObjectName(mbean);
serv.registerMBean(mbean, oname);
四.创建MBean描述文件
在上面第三段代码中,我们可以看到,要将MBean注册到MBean Server中必须先创建MBeanInfo,MBean的setModelMBeanInfo()用来将MBeanInfo设置到MBean中。
< p name="JDBCConfigMBean">
className="com.myApp.jmx.JDBCConfigMBean"
description="the object to access database"
domain="myapp">
< p name="driver">
description="Jdbc driver name"
type="java.lang.String"
writeable="false"/>
< p name="dburl">
description="database url"
type="java.lang.String"/>
< p name="username">
description="Database user name"
type="java.lang.String"/>
< p name="password">
description="vthe user name's password"
type="java.lang.String"/>
< p name="save">
description="save the configuration"
impact="ACTION"
returnType="java.lang.String">
< p name="DBAccess">
className="com.myApp.jmx.ResInstanceMBean"
description="the object to access database"
domain="myapp"
type="com.myApp.db.DBAccess">
< p name="driver">
description="Jdbc driver name"
type="java.lang.String"
writeable="false"/>
< p name="dburl">
description="database url"
type="java.lang.String"/>
< p name="username">
description="Database user name"
type="java.lang.String"/>
< p name="password">
description="vthe user name's password"
type="java.lang.String"/>
< p name="testConnection">
description="test configure attribute"
impact="ACTION"
returnType="java.lang.String">
< p name="driver">
description="Jdbc driver name for test"
type="java.lang.String"/>
< p name="username">
description="Database user name for test"
type="java.lang.String"/>
< p name="password">
description="the user name's password for test"
type="java.lang.String"/>
< p name="dburl">
description="database url for test"
type="java.lang.String"/>
五.注册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);
六.编写管理框架的客户端
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -