用JDK自帶的JMX實現來寫的MBean,JMX的實現不獨SUN一家,JBoss也有自己的JMX實現.如果你使用JBoss來做WEB伺服器,那麼基於JBoss的實現來寫MBean,是一個不錯的選擇.象我們公司就是用JBoss的,因此所有MBean都是基於JBoss來寫的.基於JBoss的MBean和基於SUN的MBean有什麼不同嗎?有一些不同之外,但絕大部份都一樣.
一、 HelloWorld實例
1、準備工作
JBOSS實現了JMX規範,這個實例是基於JBoss來實現的.請先去下載一個JBoss,我是JBoss-3.2.6,這個實例需要JBoss的兩個JAR包的支持:jboss-system-3.2.6.jar、jboss-jmx-3.2.6.jar,如果你和我一樣用Eclipse來開發(推薦),那麼把這個兩個包加入到項目的庫引用中(加入到庫引用的方法參考前面兩章).
2、程序代碼
假設我們有一個叫message的屬性要需要經常進行改動配置的,那麼我們就把它寫成一個MBean.
1)、HelloWorldServiceMBean介面
在寫MBean之前,我們先需要寫一個MBean介面,介面里的方法都是屬性的set/get方法.這個介面必須繼承介面ServiceMBean.
java 代碼
import org.jboss.system.ServiceMBean; public interface HelloWorldServiceMBean extends ServiceMBean { String getMessage(); void setMessage(String message); } |
2)、HelloWorldService實現類
然後寫出HelloWorldServiceMBean介面的實現類HelloWorldService,這個實現類還必須繼承ServiceMBeanSupport類.這種類再簡單不過了,就是屬性和相應的set/get方法,EJB中叫實體類、Hibernate中叫POJO.
java 代碼
import org.jboss.system.ServiceMBeanSupport; private String message;
|
3)、配置文件jboss-service.xml
xml version="1.0" encoding="UTF-8"?> <attribute name="Message">Hello Worldattribute> |
說明:
◆code項指向MBean的實現類HelloWorldService
◆name項是一個名稱,格式一般是:[說明性文字]:service=[類名]
◆attribute是為屬性設置初始值,這樣當JBOSS一載入HelloWorldService類時,message屬性就有了一個初始值 Hello World.注意Message的第一個字母必須是大寫.
二、將實例部署到JBOSS
在jboss-3.2.6serverdefaultdeploy目錄下創建一個hello.sar目錄,然後創建如下目錄文件結構:
hello.sar |----example | |----mbean | |----HelloWorldService.class (注意:是*.class,不是*.java) | |----HelloWorldServiceMBean.class |----META-INF |----jboss-service.xml |
其他說明:
◆也可以將hello.sar目錄用zip格式壓縮成一個同名的hello.sar文件,放到jboss-3.2.6serverdefaultdeploy目錄下.
◆JBOSS支持熱部署,也就是說你在布置這個目錄時並不需要重啟JBOSS.
三、MBean的效果
后單擊「service=HelloWorld」項打開詳細頁面
將「HelloWorld」改成「Hello World,ChenGang」,再單擊「Apply Changes」應用修改
四、其他類如何使用Messag屬性
現在我們可以通過一個自動提供的WEB頁面來設置Message屬性了,接下來的問題是:「在其他類中應該如何得到Message的屬性值」.MBean在JBoss是只保留一個MBean的實例(單例模式?),也就是說問題轉成我們如何去取得這個唯一實例.常式如下:
1、創建一個使用到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); } } |
2、在Mbean中加一個相應的調用Client.go的方法
在HelloWorldServiceMBean介面中加入一句:
void callGo(); ublic void callGo() { new Client().go(); } |
3、更新布署
將三個類的class文件:Clien.class、HelloWorldServiceMBean.class、HelloWorldService.class,更新到JBOSS的hello.sarexamplembean目錄下.然後重啟JBOSS.
4、查看效果
打開JBOSS提供的MBean設置頁面,發現多了一個callGo.
單擊callGo項后的invoke按鈕,得到DOS輸出
五、其他說明
◆本實例僅演示了一個Message屬性,你當然可以在HelloWorldService中加入更多屬性,別忘了在HelloWorldServiceMBean介面也加入相應的set/get方法.
◆本實例的message屬性是String類型的,但JMX也支持其他的類型,甚至是XML信息.對於jboss-service.xml中的XML信息,這時屬性類型要求是org.w3c.dom.Element,JMX將它封裝成了一個XML的DOM對象.
◆回顧一下,JMX也是將配置信息寫在了一個文件(jboss-service.xml文件)里嘛,相對於將配置文件寫到*.properties文件的方式,它似乎也沒什麼新鮮的地方.但通過本章實例我們可以看到JMX的一些好處:我們不用寫代碼去讀配置文件的信息,JMX支持的屬性類型是多種多樣的(如上面說的org.w3c.dom.Element).更重要的是JMX還提供了一整套的屬性之前互相訪問、互相調用的功能,這個HelloWorld實例所反映的只是冰山一角而已.
[火星人 ] 基於JBoss來寫MBean已經有591次圍觀