子在川上曰

            逝者如斯夫不舍晝夜
          隨筆 - 71, 文章 - 0, 評(píng)論 - 915, 引用 - 0
          數(shù)據(jù)加載中……

          [JMX一步步來(lái)] 9、基于JBoss來(lái)寫(xiě)MBean

           文/陳剛  from www.chengang.com.cn at 2005-12-26
           
            前面都是用JDK自帶的JMX實(shí)現(xiàn)來(lái)寫(xiě)的MBean,JMX的實(shí)現(xiàn)不獨(dú)SUN一家,JBOSS也有自己的JMX實(shí)現(xiàn)。如果你使用JBOSS來(lái)做WEB服務(wù)器,那么基于JBOSS的實(shí)現(xiàn)來(lái)寫(xiě)MBean,是一個(gè)不錯(cuò)的選擇。象我們公司就是用JBOSS的,因此所有MBean都是基于JBoss來(lái)寫(xiě)的。基于JBoss的MBean和基于SUN的MBean有什么不同嗎?有一些不同之外,但絕大部份都一樣。
           
            下面是我最早發(fā)的一篇關(guān)于JMX的文章,是我對(duì)公司所做項(xiàng)目的筆記,它上面的JMX例子就是基于JBOSS的。博客搬了幾次家,文章刪的刪丟的丟,但這篇文章還保留著,簡(jiǎn)單修改一下,再帖上吧。

          一、  HelloWorld實(shí)例

          1、準(zhǔn)備工作

            JBOSS實(shí)現(xiàn)了JMX規(guī)范,這個(gè)實(shí)例是基于JBOSS來(lái)實(shí)現(xiàn)的。請(qǐng)先去下載一個(gè)JBOSS,我是jboss-3.2.6,下載地址:http://www.jboss.com/downloads/index#as。這個(gè)實(shí)例需要JBOSS的兩個(gè)JAR包的支持:jboss-system-3.2.6.jarjboss-jmx-3.2.6.jar,如果你和我一樣用Eclipse來(lái)開(kāi)發(fā)(推薦),那么把這個(gè)兩個(gè)包加入到項(xiàng)目的庫(kù)引用中(加入到庫(kù)引用的方法參考前面兩章)。

          2、程序代碼

            假設(shè)我們有一個(gè)叫message的屬性要需要經(jīng)常進(jìn)行改動(dòng)配置的,那么我們就把它寫(xiě)成一個(gè)MBean

          1HelloWorldServiceMBean接口

            在寫(xiě)MBean之前,我們先需要寫(xiě)一個(gè)MBean接口,接口里的方法都是屬性的set/get方法。這個(gè)接口必須繼承接口ServiceMBean


          import org.jboss.system.ServiceMBean;
          public interface HelloWorldServiceMBean extends ServiceMBean {
              String getMessage();
              void setMessage(String message);
          }

          2HelloWorldService實(shí)現(xiàn)類(lèi)

            然后寫(xiě)出HelloWorldServiceMBean接口的實(shí)現(xiàn)類(lèi)HelloWorldService,這個(gè)實(shí)現(xiàn)類(lèi)還必須繼承ServiceMBeanSupport類(lèi)。這種類(lèi)再簡(jiǎn)單不過(guò)了,就是屬性和相應(yīng)的set/get方法,EJB中叫實(shí)體類(lèi)、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>

          說(shuō)明:

          l code項(xiàng)指向MBean的實(shí)現(xiàn)類(lèi)HelloWorldService
          l name項(xiàng)是一個(gè)名稱(chēng),格式一般是:[說(shuō)明性文字]:service=[類(lèi)名]
          l attribute是為屬性設(shè)置初始值,這樣當(dāng)JBOSS一加載HelloWorldService類(lèi)時(shí),message屬性就有了一個(gè)初始值Hello World。注意Message的第一個(gè)字母必須是大寫(xiě)。

          二、將實(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

          其他說(shuō)明:

          l 也可以將hello.sar目錄用zip格式壓縮成一個(gè)同名的hello.sar文件,放到jboss-3.2.6\server\default\deploy目錄下。
          l JBOSS支持熱部署,也就是說(shuō)你在布置這個(gè)目錄時(shí)并不需要重啟JBOSS

          三、MBean的效果

          打開(kāi)網(wǎng)址:http://127.0.0.1:8080/jmx-console/ ,出現(xiàn)下圖

          1135588829669_6124.jpg然后單擊“service=HelloWorld”項(xiàng)打開(kāi)詳細(xì)頁(yè)面如下:

          1135588871713_5327.jpg

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

          1135588893639_3324.jpg

          四、其他類(lèi)如何使用Messag屬性

            現(xiàn)在我們可以通過(guò)一個(gè)自動(dòng)提供的WEB頁(yè)面來(lái)設(shè)置Message屬性了,接下來(lái)的問(wèn)題是:“在其他類(lèi)中應(yīng)該如何得到Message的屬性值”。MBeanJBoss是只保留一個(gè)MBean的實(shí)例(單例模式?),也就是說(shuō)問(wèn)題轉(zhuǎn)成我們?nèi)绾稳ト〉眠@個(gè)唯一實(shí)例。例程如下:

          1、創(chuàng)建一個(gè)使用到Message屬性的類(lèi)

          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方法里是三句。第一句比較長(zhǎng),它是根據(jù)jboss-service.xml文件中設(shè)置的MBean名稱(chēng),來(lái)取得此MBeanJBOSS中的實(shí)例。

          2、在Mbean中加一個(gè)相應(yīng)的調(diào)用Client.go的方法

           在HelloWorldServiceMBean接口中加入一句:

          void callGo();

          HelloWorldService類(lèi)中加入現(xiàn)實(shí)方法:

              public void callGo() {
                  new Client().go();
              }

          3、更新布署

             將三個(gè)類(lèi)的class文件:Clien.classHelloWorldServiceMBean.classHelloWorldService.class,更新到JBOSShello.sar\example\mbean目錄下。然后重啟JBOSS

          4、查看效果

             打開(kāi)JBOSS提供的MBean設(shè)置頁(yè)面,如下,發(fā)現(xiàn)多了一個(gè)callGo

          1135589421532_8527.jpg

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

          1135589435968_2575.jpg

          五、其他說(shuō)明

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

          六、參考資料:http://www.huihoo.com/java/jmx/jmx_base.html 

          七、作者簡(jiǎn)介

          陳剛,廣西桂林人,著作有《Eclipse從入門(mén)到精通》
          您可以通過(guò)其博客了解更多信息和文章:http://www.chenGang.com.cn

          posted on 2006-03-07 15:19 陳剛 閱讀(5368) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): JMX

          評(píng)論

          # re: [JMX一步步來(lái)] 9、基于JBoss來(lái)寫(xiě)MBean  回復(fù)  更多評(píng)論   

          看過(guò)了這9篇文章,感覺(jué)是在網(wǎng)上能夠搜索到的最清晰的JMX系列文章了。8過(guò)缺了一項(xiàng)內(nèi)容:如何實(shí)現(xiàn)自己的HtmlAdaptor。期待ing...
          其實(shí)這也是我的問(wèn)題。現(xiàn)在手頭的系統(tǒng)里面正在添加JMX進(jìn)行管理,需要個(gè)性化的HtmlAdaptor和RmiConnector,一直苦于沒(méi)有太好的解決辦法。請(qǐng)賜教。
          MSN:james_zj@msn.com
          希望能和你交流JMX技術(shù)。
          2006-12-26 16:55 | 玉虎

          # re: [JMX一步步來(lái)] 9、基于JBoss來(lái)寫(xiě)MBean[未登錄](méi)  回復(fù)  更多評(píng)論   

          是陳大作者是吧 感覺(jué)你的Blog比你的書(shū)好哦
          頂了
          2008-01-03 17:19 | Allen
          主站蜘蛛池模板: 城口县| 黄山市| 安新县| 琼海市| 楚雄市| 津南区| 邵东县| 台安县| 清水县| 漠河县| 大关县| 巴塘县| 平南县| 雅安市| 信阳市| 夏邑县| 常宁市| 武城县| 溧水县| 方正县| 杭锦后旗| 武夷山市| 讷河市| 红原县| 赣州市| 青冈县| 贞丰县| 额济纳旗| 共和县| 方城县| 凌源市| 比如县| 勃利县| 汝城县| 平遥县| 萍乡市| 潮安县| 峨眉山市| 广宁县| 榕江县| 阿克苏市|