用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 org
jboss
system
ServiceMBean;
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
implements HelloWorldServiceMBean {
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實例所反映的只是冰山一角而已
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28796.html