子在川上曰

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

          [JMX一步步來] 5、用Apache的commons-modeler來輔助開發(fā)JMX

          文/陳剛  from www.chengang.com.cn at 2005-12-13
           
          一、前言
           
            每一個(gè)MBean都要有一個(gè)接口,比如前面的Hello要有一個(gè)HelloMBean接口。要多維護(hù)一個(gè)接口,的確是件麻煩的事。Apache的commons-modeler利用JMX中的動(dòng)態(tài)MBean原理很好的解決了這一問題,commons-modeler使用得我們可以只寫Hello,而不用寫HelloMBean這個(gè)接口。不過這是有代價(jià)的,它要求我們寫一個(gè)mbean的xml描述文件(唉,少了一件事,卻又多出另一件事來)。但commons-modeler還是有優(yōu)點(diǎn)的,就是它讓mbean的裝配更加靈活,把多個(gè)mbean的裝配都集中在一個(gè)XML文件里來了。
            開始實(shí)例之前,你需要先去apache網(wǎng)站下載commons-modeler,以及modeler的依賴項(xiàng)目commons-logging。下載網(wǎng)址為:http://jakarta.apache.org/site/downloads/downloads_commons.html,下載的文件是ZIP壓縮包,解壓后找到commons-logging.jar和commons-modeler.jar。如果在DOS下用命令行開發(fā),則把這兩個(gè)JAR包加入到classpath系統(tǒng)變量中。如果你用Eclipse開發(fā),則把JAR包加入到項(xiàng)目屬性的Libratries(庫)引用中。
           
          二、HelloWorld實(shí)例
           
            我們以本系統(tǒng)的第一篇“1、JMX的Hello World”為例,來重新實(shí)現(xiàn)一次。
           
          1、Hello.java的代碼不變(注:為了在Eclipse上和原來的Hello文件放在不同的地方,我把新Hello放到了mbean.modelbean包),如下:
          package mbean.modelbean;
          import mbean.standard.HelloMBean;
          public class Hello implements HelloMBean {
              private String name;
              public String getName() {
                  return name;
              }
              public void setName(String name) {
                  this.name = name;
              }
              public void printHello() {
                  System.out.println("Hello World, " + name);
              }
              public void printHello(String whoName) {
                  System.out.println("Hello , " + whoName);
              }
          }
           
          2、MBean不用寫了,但需要寫一個(gè)XML描述文件。文件名任取,這里取名為:mbeans-descriptors
          <?xml version="1.0"?>
          <mbeans-descriptors>
           <mbean name="Hello" description="the hello bean" domain="chengang" group="helloGroup" type="mbean.modelbean.Hello">
            <attribute name="name" description="a name attribute" type="java.lang.String" writeable="true"/>
            <operation name="printHello" description="a operation to print hello" impact="INFO" returnType="String"/>
           </mbean>
          </mbeans-descriptors> 
          這里只對(duì)<mbean>標(biāo)簽做一下說明:
          • name mbean在xml中的唯一標(biāo)識(shí),不一定要和類同名
          • description mbean的注釋說明信息
          • domain mbean所屬域
          • group mbean所屬組
          • type mbean的類全名(包名+類名)
          • classname 指定實(shí)現(xiàn)代理功能的ModelMbean的全名,如果不指定則默認(rèn)為BaseModelMBean 
          3、接下來改寫HelloAgent
          package mbean.modelbean;
          import java.io.InputStream;
          import javax.management.MBeanServer;
          import javax.management.ObjectName;
          import javax.management.modelmbean.ModelMBean;
          import org.apache.commons.modeler.ManagedBean;
          import org.apache.commons.modeler.Registry;
          import com.sun.jdmk.comm.HtmlAdaptorServer;
          public class HelloAgent {
              public static void main(String[] args) throws Exception {
                  //基于xml中的信息構(gòu)建一個(gè)Registry
                  Registry registry = Registry.getRegistry(null, null);
                  InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
                  registry.loadMetadata(stream);
                  stream.close();
                  //由Registry得到一個(gè)MBeanServer
                  MBeanServer server = registry.getMBeanServer();
                  //得到Hello在描述文件中的信息類,對(duì)應(yīng)于xml文件<mbean>標(biāo)簽的name屬性。
                  ManagedBean managed = registry.findManagedBean("Hello");
                  //創(chuàng)建ObjectName
                  ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
                  //得到ModelMBean
                  ModelMBean hello = managed.createMBean(new Hello());
                  //注冊(cè)MBean
                  server.registerMBean(hello, helloName);
                  ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
                  HtmlAdaptorServer adapter = new HtmlAdaptorServer();
                  server.registerMBean(adapter, adapterName);
                  adapter.start();
                  System.out.println("start.....");
              }
          }
           
          HelloAgent是效復(fù)雜的地方,我們來和以前的HelloAgent逐步比較一下,前后有什么不同:
          (1)首先,新的HelloAgent需要將xml信息讀入到Registry對(duì)象中,這是舊HelloAgent所沒有的。
          Registry registry = Registry.getRegistry(null, null);
          InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
          registry.loadMetadata(stream);
          stream.close();
           
          (2)接著創(chuàng)建MBeanServer的方式也不同了
          現(xiàn)在:MBeanServer server = registry.getMBeanServer();
          以前: MBeanServer server = MBeanServerFactory.createMBeanServer();
           
          (3)Hello相應(yīng)的ObjectName創(chuàng)建也略不相同。主要是域名在XML描述文件里設(shè)置好了。
          現(xiàn)在:ManagedBean managed = registry.findManagedBean("Hello");
               ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
          以前:ObjectName helloName = new ObjectName("chengang:name=HelloWorld")
           
          (4)得到MBean的方式也不同,這里就是關(guān)鍵的不同點(diǎn)
          現(xiàn)在:ModelMBean hello = managed.createMBean(new Hello());
          以前:Hello hello = new Hello();
          注意:為什么現(xiàn)在要比以前多一個(gè)createMbean步驟呢,就是因?yàn)楝F(xiàn)在的寫法并沒有寫Mbean,所以需要?jiǎng)討B(tài)才需要生成一個(gè)。而以前就直接把new Hello()注冊(cè)到mbean server就可以了,server會(huì)自動(dòng)找到它的HelloMBean接口文件。
           
           也就上面四點(diǎn)區(qū)別,其他代碼完全一樣。測試和查看效果的方法和以前一樣,在此不累述了。我們來看看界面情況有那些變化(紅圈部份)。
          1134441073198_3333.gif
           
           由圖可見commons Modeler為Hello動(dòng)態(tài)生成了一個(gè)MBean接口:BaseModelBean
           
          參考資料

          作者簡介

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

          posted on 2006-03-07 15:05 陳剛 閱讀(4297) 評(píng)論(0)  編輯  收藏 所屬分類: JMX

          主站蜘蛛池模板: 阳江市| 廊坊市| 慈溪市| 磴口县| 稻城县| 黄冈市| 铜山县| 玉屏| 弥渡县| 正镶白旗| 合阳县| 峨山| 尚志市| 诸暨市| 高州市| 茂名市| 靖安县| 肥东县| 长海县| 临江市| 万载县| 鄂托克旗| 焦作市| 高安市| 太保市| 海口市| 江阴市| 岚皋县| 商城县| 城市| 儋州市| 察哈| 沾化县| 白朗县| 舟山市| 东莞市| 乐山市| 甘谷县| 河曲县| 宁波市| 蛟河市|