<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    hengheng123456789

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
    一、前言
     
      每一個MBean都要有一個接口,比如前面的Hello要有一個HelloMBean接口。要多維護一個接口,的確是件麻煩的事。 Apache的commons-modeler利用JMX中的動態(tài)MBean原理很好的解決了這一問題,commons-modeler使用得我們可以只寫Hello,而不用寫HelloMBean這個接口。不過這是有代價的,它要求我們寫一個mbean的xml描述文件(唉,少了一件事,卻又多出另一件事來)。但commons-modeler還是有優(yōu)點的,就是它讓mbean的裝配更加靈活,把多個mbean的裝配都集中在一個XML文件里來了。
      開始實例之前,你需要先去apache網站下載commons-modeler,以及modeler的依賴項目commons-logging。下載網址為:http://jakarta.apache.org/site/downloads/downloads_commons.html,下載的文件是ZIP壓縮包,解壓后找到commons-logging.jar和commons-modeler.jar。如果在DOS下用命令行開發(fā),則把這兩個JAR包加入到classpath系統變量中。如果你用Eclipse開發(fā),則把JAR包加入到項目屬性的Libratries(庫)引用中。
    ?
    二、HelloWorld實例
    ?
    ? 我們以本系統的第一篇“1、JMX的Hello World”為例,來重新實現一次。
     
    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不用寫了,但需要寫一個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>

    這里只對<mbean>標簽做一下說明:

    ??? * name mbean在xml中的唯一標識,不一定要和類同名
    ??? * description mbean的注釋說明信息
    ??? * domain mbean所屬域
    ??? * group mbean所屬組
    ??? * type mbean的類全名(包名+類名)
    ??? * classname 指定實現代理功能的ModelMbean的全名,如果不指定則默認為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中的信息構建一個Registry
    ??????? Registry registry = Registry.getRegistry(null, null);
    ??????? InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
    ??????? registry.loadMetadata(stream);
    ??????? stream.close();
    ??????? //由Registry得到一個MBeanServer
    ??????? MBeanServer server = registry.getMBeanServer();

    ??????? //得到Hello在描述文件中的信息類,對應于xml文件<mbean>標簽的name屬性。
    ??????? ManagedBean managed = registry.findManagedBean("Hello");
    ??????? //創(chuàng)建ObjectName
    ??????? ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
    ??????? //得到ModelMBean
    ??????? ModelMBean hello = managed.createMBean(new Hello());
    ??????? //注冊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是效復雜的地方,我們來和以前的HelloAgent逐步比較一下,前后有什么不同:
    (1)首先,新的HelloAgent需要將xml信息讀入到Registry對象中,這是舊HelloAgent所沒有的。

    Registry registry = Registry.getRegistry(null, null);
    InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
    registry.loadMetadata(stream);
    stream.close();

    ?
    (2)接著創(chuàng)建MBeanServer的方式也不同了
    現在:MBeanServer server = registry.getMBeanServer();
    以前: MBeanServer server = MBeanServerFactory.createMBeanServer();
     
    (3)Hello相應的ObjectName創(chuàng)建也略不相同。主要是域名在XML描述文件里設置好了。
    現在:ManagedBean managed = registry.findManagedBean("Hello");
    ???? ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
    以前:ObjectName helloName = new ObjectName("chengang:name=HelloWorld")
     
    (4)得到MBean的方式也不同,這里就是關鍵的不同點
    現在:ModelMBean hello = managed.createMBean(new Hello());
    以前:Hello hello = new Hello();
    注意:為什么現在要比以前多一個createMbean步驟呢,就是因為現在的寫法并沒有寫Mbean,所以需要動態(tài)才需要生成一個。而以前就直接把new Hello()注冊到mbean server就可以了,server會自動找到它的HelloMBean接口文件。
     
     也就上面四點區(qū)別,其他代碼完全一樣。測試和查看效果的方法和以前一樣,在此不累述了。

     
     commons Modeler為Hello動態(tài)生成了一個MBean接口:BaseModelBean
     
    參考資料
      用Commons Modeler 開發(fā)JMX應用
    posted on 2006-08-29 11:09 哼哼 閱讀(1021) 評論(1)  編輯  收藏 所屬分類: JMX

    Feedback

    # re: 5、用Apache的commons-modeler來輔助開發(fā)JMX 2016-08-03 17:07 袁良錠
    樓主第一個類忘記去掉implements HelloMBean了。  回復  更多評論
      

    主站蜘蛛池模板: 亚洲AV成人片色在线观看| 毛片免费全部播放无码| 亚洲a视频在线观看| 亚洲国产精品无码av| 深夜国产福利99亚洲视频| 欧洲黑大粗无码免费| 亚洲精品国产免费| 日韩av无码免费播放| 精品乱子伦一区二区三区高清免费播放| jiz zz在亚洲| 亚洲一级黄色大片| 91久久亚洲国产成人精品性色| 亚洲精品高清国产一线久久| 亚洲精品岛国片在线观看| 国产在线观看免费完整版中文版 | 亚洲综合亚洲综合网成人| 日本免费一二区在线电影| 久久这里只有精品国产免费10| 亚洲美女免费视频| 182tv免费视视频线路一二三| 美女视频黄a视频全免费网站色窝 美女被cao网站免费看在线看 | 亚洲依依成人亚洲社区| 亚洲性无码av在线| 亚洲一本之道高清乱码| 亚洲免费网站在线观看| 亚洲六月丁香六月婷婷蜜芽| 亚洲成人高清在线观看| 亚洲午夜一区二区电影院| 久久狠狠爱亚洲综合影院| 亚洲最大天堂无码精品区| 亚洲日韩一中文字暮| 亚洲av午夜电影在线观看 | 在线成人a毛片免费播放| 国产高清在线免费视频| 国产成人免费手机在线观看视频| 四虎永久在线精品免费观看地址 | 亚洲一区在线观看视频| 亚洲色精品VR一区区三区| 亚洲精品无码mⅴ在线观看| 国产精品亚洲av色欲三区| 国产成人 亚洲欧洲|