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

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

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

    子在川上曰

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

    [JMX一步步來(lái)] 6、模型Bean:Model Bean

    文/陳剛  from www.chengang.com.cn at 2005-12-26
     
      在上一節(jié)是用apache的commons-modeler來(lái)開(kāi)發(fā)的一個(gè)model,只不過(guò)commons-modeler幫助我們實(shí)現(xiàn)了很多的代碼,而我們只需要寫(xiě)描述XML文件就行了。這一節(jié),來(lái)一個(gè)實(shí)打?qū)嵉腗odel Bean,不借助任何第三方工具包。例子還是沿用Hello這個(gè)類,以便于和以前的實(shí)現(xiàn)相比較。
     
    一、Model MBean實(shí)例
    1、Hello.java還是和以前的一樣。這里它沒(méi)有再加上一個(gè)MBean接口了,只是一個(gè)很普通的類。
    public class Hello{
        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、接下來(lái)是HelloAgent的寫(xiě)法,和以前就差一句:把“new Hello()”這一句刪除了,加上了ModelMbeanUtils.createModlerMbean();
    import javax.management.MBeanServer;
    import javax.management.MBeanServerFactory;
    import javax.management.ObjectName;
    import javax.management.modelmbean.RequiredModelMBean;
    import com.sun.jdmk.comm.HtmlAdaptorServer;
    public class HelloAgent {
        public static void main(String[] args) throws Exception {
            MBeanServer server = MBeanServerFactory.createMBeanServer();
            ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
            //Hello hello = new Hello();
            RequiredModelMBean hello = ModelMBeanUtils.createModlerMBean();
            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.....");
        }
    }
     
    3、ModelMbeanUtils這個(gè)類是要我們自己來(lái)實(shí)現(xiàn)的,也是寫(xiě)model Bean最麻煩的地方,它主要是返回一個(gè)RequiredModelMBean類,此類主要包括了一個(gè)ModelMBeanInfo類的信息。在ModelMBeanInfo中定義了所有對(duì)需要管理的屬性和方法的描述。具體代碼如下:
    import javax.management.MBeanParameterInfo;
    import javax.management.modelmbean.ModelMBeanAttributeInfo;
    import javax.management.modelmbean.ModelMBeanInfo;
    import javax.management.modelmbean.ModelMBeanInfoSupport;
    import javax.management.modelmbean.ModelMBeanOperationInfo;
    import javax.management.modelmbean.RequiredModelMBean;
    public class ModelMBeanUtils {
        private static final boolean READABLE = true;
        private static final boolean WRITABLE = true;
        private static final boolean BOOLEAN = true;
        private static final String STRING_CLASS = "java.lang.String";
        public static RequiredModelMBean createModlerMBean() {
            RequiredModelMBean model = null;
            try {
                model = new RequiredModelMBean();
                model.setManagedResource(new Hello(), "ObjectReference");
                ModelMBeanInfo info = createModelMBeanInfo();
                model.setModelMBeanInfo(info);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return model;
        }
        private static ModelMBeanInfo createModelMBeanInfo() {
            //////////////////////////////////////////////////////////////////
            //                        屬性                                        //
            //////////////////////////////////////////////////////////////////
            // 構(gòu)造name屬性信息
            ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
                    "Name", // 屬性名       
                    STRING_CLASS, //屬性類型    
                    "people name", // 描述文字      
                    READABLE, WRITABLE, !BOOLEAN, // 讀寫(xiě)      
                    null // 屬性描述子
            );
            //////////////////////////////////////////////////////////////////
            //                        方法                                        //
            //////////////////////////////////////////////////////////////////
            //構(gòu)造 printHello()操作的信息       
            ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//
                    "printHello", //
                    null, //  
                    null, //
                    "void", //  
                    MBeanOperationInfo.INFO, //    
                    null //
            );
            // 構(gòu)造printHello(String whoName)操作信息     
            ModelMBeanOperationInfo print2Info;
            MBeanParameterInfo[] param2 = new MBeanParameterInfo[1];
            param2[0] = new MBeanParameterInfo("whoName", STRING_CLASS, "say hello to who");
            print2Info = new ModelMBeanOperationInfo(//
                    "printHello", //
                    null,//
                    param2,//
                    "void", //
                    MBeanOperationInfo.INFO, //
                    null//
            );
            //////////////////////////////////////////////////////////////////
            //                        最后總合                                    //
            //////////////////////////////////////////////////////////////////
            // create ModelMBeanInfo       
            ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
                    RequiredModelMBean.class.getName(), // MBean類
                    null, // 描述文字     
                    new ModelMBeanAttributeInfo[] { // 所有的屬性信息(數(shù)組)
                    nameAttrInfo },//只有一個(gè)屬性
                    null, // 所有的構(gòu)造函數(shù)信息  
                    new ModelMBeanOperationInfo[] { // 所有的操作信息(數(shù)組)
                            print1Info,
                            print2Info },//
                    null, // 所有的通知信息(本例無(wú))
                    null//MBean描述子
            );
            return mbeanInfo;
        }
    }
     
    4、看效果的方法和以前一樣,運(yùn)行HelloAgent,用瀏覽器打開(kāi):http://localhost:8082 。效果圖和standard mbean一樣,就不再帖出來(lái)了,去第一篇去看吧http://blog.sohu.com/members/somebody076/545896.html
     
    二、總結(jié)
     
       我們發(fā)現(xiàn)模型Mbean(Model MBean)要比標(biāo)準(zhǔn)MBean(standard mbean)復(fù)雜多了,那有什么理由讓我們選擇使用模型MBean嗎?我認(rèn)為,最大的理由就是模型MBean可以動(dòng)態(tài)配置。試想一下這個(gè)應(yīng)用場(chǎng)景:由于安全或其他原因,系統(tǒng)要把某個(gè)MBean公開(kāi)的可管理方法隱藏起來(lái)。這時(shí),如果你是用標(biāo)準(zhǔn)MBean,這需要修改接口類,然后重新編譯發(fā)布;如果用Apache commons-modeler來(lái)寫(xiě)的模型MBean,則只需要修改XML文件就行了,不需要重新編譯發(fā)布(可能要重啟一下系統(tǒng))。這就是模型Mbean優(yōu)勢(shì)之所在了。
     
     細(xì)心的人會(huì)發(fā)現(xiàn)動(dòng)態(tài)MBean和這一節(jié)的模型Mbean非常相似,但它們還是有很大不同的:動(dòng)態(tài)MBean沒(méi)有Hello類,它要自己實(shí)現(xiàn)Hello類中的方法邏輯。
       

    作者簡(jiǎn)介

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

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

    評(píng)論

    # re: [JMX一步步來(lái)] 6、模型Bean:Model Bean  回復(fù)  更多評(píng)論   

    不能修改屬性的值
    2010-09-26 16:18 | stafffree
    主站蜘蛛池模板: 亚洲av之男人的天堂网站| va亚洲va日韩不卡在线观看| 久久综合九九亚洲一区| 精品国产一区二区三区免费| 亚洲精品乱码久久久久久自慰| 午夜寂寞在线一级观看免费| 亚洲黄色中文字幕| 无码国产精品一区二区免费式直播 | 亚洲伊人久久成综合人影院| 国产亚洲综合久久| 亚洲成av人在片观看| 污视频网站免费观看| 免费人妻av无码专区| 一级毛片一级毛片免费毛片| 亚洲精品美女久久久久99| 一级毛片在线免费观看| 亚洲综合校园春色| 国产成人无码区免费A∨视频网站| 人人狠狠综合久久亚洲88| 久久美女网站免费| 亚洲国产精品xo在线观看| 麻豆最新国产剧情AV原创免费| 国产午夜亚洲不卡| 最近免费中文字幕中文高清| 亚洲av无码不卡一区二区三区| WWW国产亚洲精品久久麻豆| 亚洲色图综合在线| APP在线免费观看视频| 亚洲成人黄色在线观看| 国产无遮挡吃胸膜奶免费看| 国产精品永久免费| 亚洲欧洲国产经精品香蕉网| 毛色毛片免费观看| 黄色网址免费在线观看| 亚洲理论片在线中文字幕| 免费永久看黄在线观看app| 国产一精品一AV一免费| 亚洲性色精品一区二区在线| 国产乱辈通伦影片在线播放亚洲| 亚洲色无码国产精品网站可下载| 青青青国产手机频在线免费观看|