歡迎您光臨本站 註冊首頁

基於JBoss來寫MBean

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0

用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;
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 Worldattribute>
mbean>
server>

說明:
◆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);
}
}


注意:go方法里是三句.第一句比較長,它是根據jboss-service.xml文件中設置的MBean名稱,來取得此MBean在JBOSS中的實例.

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次圍觀

http://coctec.com/docs/java/show-post-61456.html