前面都是用JDK自帶的JMX實(shí)現(xiàn)來寫的MBean,JMX的實(shí)現(xiàn)不獨(dú)SUN一家,JBOSS也有自己的JMX實(shí)現(xiàn)。如果你使用JBOSS來做WEB服務(wù)器,那么基于JBOSS的實(shí)現(xiàn)來寫MBean,是一個(gè)不錯(cuò)的選擇。象我們公司就是用JBOSS的,因此所有MBean都是基于JBoss來寫的。基于JBoss的MBean和基于SUN的MBean有什么不同嗎?有一些不同之外,但絕大部份都一樣。
下面是我最早發(fā)的一篇關(guān)于JMX的文章,是我對公司所做項(xiàng)目的筆記,它上面的JMX例子就是基于JBOSS的。博客搬了幾次家,文章刪的刪丟的丟,但這篇文章還保留著,簡單修改一下,再帖上吧。
一、 HelloWorld實(shí)例
1、準(zhǔn)備工作
JBOSS實(shí)現(xiàn)了JMX規(guī)范,這個(gè)實(shí)例是基于JBOSS來實(shí)現(xiàn)的。請先去下載一個(gè)JBOSS,我是jboss-3.2.6,下載地址:http://www.jboss.com/downloads/index#as。這個(gè)實(shí)例需要JBOSS的兩個(gè)JAR包的支持:jboss-system-3.2.6.jar、jboss-jmx-3.2.6.jar,如果你和我一樣用Eclipse來開發(fā)(推薦),那么把這個(gè)兩個(gè)包加入到項(xiàng)目的庫引用中(加入到庫引用的方法參考前面兩章)。
2、程序代碼
假設(shè)我們有一個(gè)叫message的屬性要需要經(jīng)常進(jìn)行改動配置的,那么我們就把它寫成一個(gè)MBean。
1、HelloWorldServiceMBean接口
在寫MBean之前,我們先需要寫一個(gè)MBean接口,接口里的方法都是屬性的set/get方法。這個(gè)接口必須繼承接口ServiceMBean。
import org.jboss.system.ServiceMBean;
public interface HelloWorldServiceMBean extends ServiceMBean {
String getMessage();
void setMessage(String message);
}
2、HelloWorldService實(shí)現(xiàn)類
然后寫出HelloWorldServiceMBean接口的實(shí)現(xiàn)類HelloWorldService,這個(gè)實(shí)現(xiàn)類還必須繼承ServiceMBeanSupport類。這種類再簡單不過了,就是屬性和相應(yīng)的set/get方法,EJB中叫實(shí)體類、Hibernate中叫POJO。
import org.jboss.system.ServiceMBeanSupport;
public class HelloWorldService extends ServiceMBeanSupport implements HelloWorldServiceMBean {
private String message;
public String getMessage() {
System.out.println("getMessage()=" + message);
return message;
}
public void setMessage(String message) {
System.out.println("setMessage(" + message + ")");
this.message = message;
}
}
3、配置文件jboss-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="example.mbean.HelloWorldService" name="www.chengang.com.cn:service=HelloWorld">
<attribute name="Message">Hello World</attribute>
</mbean>
</server>
說明:
l code項(xiàng)指向MBean的實(shí)現(xiàn)類HelloWorldService
l name項(xiàng)是一個(gè)名稱,格式一般是:[說明性文字]:service=[類名]
l attribute是為屬性設(shè)置初始值,這樣當(dāng)JBOSS一加載HelloWorldService類時(shí),message屬性就有了一個(gè)初始值Hello World。注意Message的第一個(gè)字母必須是大寫。
二、將實(shí)例部署到JBOSS
在jboss-3.2.6\server\default\deploy目錄下創(chuàng)建一個(gè)hello.sar目錄,然后創(chuàng)建如下目錄文件結(jié)構(gòu):
hello.sar
|----example
| |----mbean
| |----HelloWorldService.class (注意:是*.class,不是*.java)
| |----HelloWorldServiceMBean.class
|----META-INF
|----jboss-service.xml
其他說明:
l 也可以將hello.sar目錄用zip格式壓縮成一個(gè)同名的hello.sar文件,放到jboss-3.2.6\server\default\deploy目錄下。
l JBOSS支持熱部署,也就是說你在布置這個(gè)目錄時(shí)并不需要重啟JBOSS。
然后單擊“service=HelloWorld”項(xiàng)打開詳細(xì)頁面如下:

將“HelloWorld”改成“Hello World,ChenGang”,再單擊“Apply Changes”應(yīng)用修改,得到如下效果:

四、其他類如何使用Messag屬性
現(xiàn)在我們可以通過一個(gè)自動提供的WEB頁面來設(shè)置Message屬性了,接下來的問題是:“在其他類中應(yīng)該如何得到Message的屬性值”。MBean在JBoss是只保留一個(gè)MBean的實(shí)例(單例模式?),也就是說問題轉(zhuǎn)成我們?nèi)绾稳ト〉眠@個(gè)唯一實(shí)例。例程如下:
1、創(chuàng)建一個(gè)使用到Message屬性的類
import org.jboss.mx.util.MBeanProxyExt;
import org.jboss.mx.util.ObjectNameFactory;
public class Client {
public void go() {
HelloWorldServiceMBean mbean = (HelloWorldServiceMBean) MBeanProxyExt.create(HelloWorldServiceMBean.class, ObjectNameFactory.create(www.chengang.com.cn:service=HelloWorld));
String msg = mbean.getMessage();
System.out.println("Client.go()=" + msg);
}
}
注意:go方法里是三句。第一句比較長,它是根據(jù)jboss-service.xml文件中設(shè)置的MBean名稱,來取得此MBean在JBOSS中的實(shí)例。
2、在Mbean中加一個(gè)相應(yīng)的調(diào)用Client.go的方法
在HelloWorldServiceMBean接口中加入一句:
在HelloWorldService類中加入現(xiàn)實(shí)方法:
public void callGo() {
new Client().go();
}
3、更新布署
將三個(gè)類的class文件:Clien.class、HelloWorldServiceMBean.class、HelloWorldService.class,更新到JBOSS的hello.sar\example\mbean目錄下。然后重啟JBOSS。
4、查看效果
打開JBOSS提供的MBean設(shè)置頁面,如下,發(fā)現(xiàn)多了一個(gè)callGo。

單擊callGo項(xiàng)后的invoke按鈕,得到如下的DOS輸出:

五、其他說明
l 本實(shí)例僅演示了一個(gè)Message屬性,你當(dāng)然可以在HelloWorldService中加入更多屬性,別忘了在HelloWorldServiceMBean接口也加入相應(yīng)的set/get方法。
l 本實(shí)例的message屬性是String類型的,但JMX也支持其他的類型,甚至是XML信息。對于jboss-service.xml中的XML信息,這時(shí)屬性類型要求是org.w3c.dom.Element,JMX將它封裝成了一個(gè)XML的DOM對象。
l 回顧一下,JMX也是將配置信息寫在了一個(gè)文件(jboss-service.xml文件)里嘛,相對于將配置文件寫到*.properties文件的方式,它似乎也沒什么新鮮的地方。但通過本章實(shí)例我們可以看到JMX的一些好處:我們不用寫代碼去讀配置文件的信息,而且JMX支持的屬性類型是多種多樣的(如上面說的org.w3c.dom.Element)。更重要的是JMX還提供了一整套的屬性之前互相訪問、互相調(diào)用的功能,這個(gè)HelloWorld實(shí)例所反映的只是冰山一角而已。