用JDK自带的JMX实现来写的MBeanJMX的实现不独SUN一家JBoss也有自己的JMX实现如果你使用JBoss来做WEB服务器那么基于JBoss的实现来写MBean是一个不错的选择象我们公司就是用JBoss的因此所有MBean都是基于JBoss来写的基于JBoss的MBean和基于SUN的MBean有什么不同吗?有一些不同之外但绝大部份都一样
一 HelloWorld实例
准备工作
JBOSS实现了JMX规范这个实例是基于JBoss来实现的请先去下载一个JBoss我是JBoss这个实例需要JBoss的两个JAR包的支持jbosssystemjarjbossjmxjar如果你和我一样用Eclipse来开发(推荐)那么把这个两个包加入到项目的库引用中(加入到库引用的方法参考前面两章)
程序代码
假设我们有一个叫message的属性要需要经常进行改动配置的那么我们就把它写成一个MBean
)HelloWorldServiceMBean接口
在写MBean之前我们先需要写一个MBean接口接口里的方法都是属性的set/get方法这个接口必须继承接口ServiceMBean
java 代码
import orgjbosssystemServiceMBean;
public interface HelloWorldServiceMBean extends ServiceMBean {
String getMessage();
void setMessage(String message);
}
)HelloWorldService实现类
然后写出HelloWorldServiceMBean接口的实现类HelloWorldService这个实现类还必须继承ServiceMBeanSupport类这种类再简单不过了就是属性和相应的set/get方法EJB中叫实体类Hibernate中叫POJO
java 代码
import orgjbosssystemServiceMBeanSupport;
public class HelloWorldService extends ServiceMBeanSupport
implementsHelloWorldServiceMBean{
private String message;
public String getMessage() {
Systemoutprintln(getMessage()= + message);
return message;
}
public void setMessage(String message) {
Systemoutprintln(setMessage( + message + ));
ssage = message;
}
}
)配置文件jbossservicexml
xml version= encoding=UTF?>
<server>
<mbean code=examplembeanHelloWorldService
name=:service=HelloWorld>
<attribute name=Message>Hello Worldattribute>
mbean>
server>
说明
◆code项指向MBean的实现类HelloWorldService
◆name项是一个名称格式一般是[说明性文字]:service=[类名]
◆attribute是为属性设置初始值这样当JBOSS一加载HelloWorldService类时message属性就有了一个初始值 Hello World注意Message的第一个字母必须是大写
二将实例部署到JBOSS
在jboss\server\default\deploy目录下创建一个hellosar目录然后创建如下目录文件结构
hellosar
|example
| |mbean
| |HelloWorldServiceclass (注意是*class不是*java)
| |HelloWorldServiceMBeanclass
|METAINF
|jbossservicexml
其他说明
◆也可以将hellosar目录用zip格式压缩成一个同名的hellosar文件放到jboss\server\default\deploy目录下
◆JBOSS支持热部署也就是说你在布置这个目录时并不需要重启JBOSS
三MBean的效果
后单击service=HelloWorld项打开详细页面
将HelloWorld改成Hello WorldChenGang再单击Apply Changes应用修改
四其他类如何使用Messag属性
现在我们可以通过一个自动提供的WEB页面来设置Message属性了接下来的问题是在其他类中应该如何得到Message的属性值MBean在JBoss是只保留一个MBean的实例(单例模式?)也就是说问题转成我们如何去取得这个唯一实例例程如下
创建一个使用到Message属性的类
import orgjbossmxutilMBeanProxyExt;
import orgjbossmxutilObjectNameFactory;
public class Client {
public void go() {
HelloWorldServiceMBean mbean = (HelloWorldServiceMBean) MBeanProxyExtcreate(HelloWorldServiceMBeanclass ObjectNameFactorycreate(:service=HelloWorld));
String msg = mbeangetMessage();
Systemoutprintln(Clientgo()= + msg);
}
}
注意go方法里是三句第一句比较长它是根据jbossservicexml文件中设置的MBean名称来取得此MBean在JBOSS中的实例
在Mbean中加一个相应的调用Clientgo的方法
在HelloWorldServiceMBean接口中加入一句
void callGo();
ublic void callGo() {
new Client()go();
}
更新布署
将三个类的class文件ClienclassHelloWorldServiceMBeanclassHelloWorldServiceclass更新到JBOSS的hellosar\example\mbean目录下然后重启JBOSS
查看效果
打开JBOSS提供的MBean设置页面发现多了一个callGo
单击callGo项后的invoke按钮得到DOS输出
五其他说明
◆本实例仅演示了一个Message属性你当然可以在HelloWorldService中加入更多属性别忘了在HelloWorldServiceMBean接口也加入相应的set/get方法
◆本实例的message属性是String类型的但JMX也支持其他的类型甚至是XML信息对于jbossservicexml中的XML信息这时属性类型要求是orgwcdomElementJMX将它封装成了一个XML的DOM对象
◆回顾一下JMX也是将配置信息写在了一个文件(jbossservicexml文件)里嘛相对于将配置文件写到*properties文件的方式它似乎也没什么新鲜的地方但通过本章实例我们可以看到JMX的一些好处我们不用写代码去读配置文件的信息而且JMX支持的属性类型是多种多样的(如上面说的orgwcdomElement)更重要的是JMX还提供了一整套的属性之前互相访问互相调用的功能这个HelloWorld实例所反映的只是冰山一角而已