<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

    在上一節是用apache的commons-modeler來開發的一個model,只不過commons-modeler幫助我們實現了很多的代碼,而我們只需要寫描述XML文件就行了。這一節,來一個實打實的Model Bean,不借助任何第三方工具包。例子還是沿用Hello這個類,以便于和以前的實現相比較。
     
    一、Model MBean實例
    1、Hello.java還是和以前的一樣。這里它沒有再加上一個MBean接口了,只是一個很普通的類。

    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、接下來是HelloAgent的寫法,和以前就差一句:把“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這個類是要我們自己來實現的,也是寫model Bean最麻煩的地方,它主要是返回一個RequiredModelMBean類,此類主要包括了一個ModelMBeanInfo類的信息。在 ModelMBeanInfo中定義了所有對需要管理的屬性和方法的描述。具體代碼如下:

    import javax.management.Descriptor;
    import javax.management.MBeanOperationInfo;
    import javax.management.MBeanParameterInfo;
    import javax.management.modelmbean.DescriptorSupport;
    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() {
    ??????? //////////////////////////////////////////////////////////////////
    ??????? //??????????????????????? 屬性??????????????????????????????????????? //
    ??????? //////////////////////////////////////////////////////////////////
    ??????? // 構造name屬性信息
    ????????Descriptor portAttrDesc = new DescriptorSupport();
    ????????portAttrDesc.setField("name", "Name");
    ????????portAttrDesc.setField("descriptorType", "attribute");
    ????????portAttrDesc.setField("displayName", "Name");
    ????????portAttrDesc.setField("getMethod", "getName");
    ????????portAttrDesc.setField("setMethod", "setName");

    ??????? ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
    ??????????????? "Name", // 屬性名????? ?
    ??????????????? STRING_CLASS, //屬性類型?? ?
    ??????????????? "people name", // 描述文字???? ?
    ??????????????? READABLE, WRITABLE, !BOOLEAN, // 讀寫???? ?
    ??????????????? portAttrDesc // 屬性描述子
    ??????? );
    ??????? //////////////////////////////////////////////////////////////////
    ??????? //??????????????????????? 方法??????????????????????????????????????? //
    ??????? //////////////////////////////////////////////////////////////////
    ????????// 構造 getName操作描述符信息
    ????????Descriptor getStateDesc = new DescriptorSupport(new String[] {
    ??????????"name=getName", "descriptorType=operation", "class=Hello",
    ??????????"role=operation" });

    ????????ModelMBeanOperationInfo getName = new ModelMBeanOperationInfo(//
    ??????????"getName", //
    ??????????"get name attribute", //
    ??????????null, //
    ??????????"java.lang.String", //
    ??????????MBeanOperationInfo.ACTION, //
    ??????????getStateDesc //
    ????????);

    ????????// 構造 setName操作描述符信息
    ????????Descriptor setStateDesc = new DescriptorSupport(new String[] {
    ??????????"name=setName", "descriptorType=operation", "class=Hello",
    ??????????"role=operation" });

    ????????MBeanParameterInfo[] setStateParms = new MBeanParameterInfo[] { (new MBeanParameterInfo(
    ??????????"name", "java.lang.String", "new name value")) };

    ????????ModelMBeanOperationInfo setName = new ModelMBeanOperationInfo(//
    ??????????"setName", //
    ??????????"set name attribute", //
    ??????????setStateParms, //
    ??????????"void", //
    ??????????MBeanOperationInfo.ACTION, //
    ??????????setStateDesc //
    ????????);


    ??????? //構造 printHello()操作的信息????? ?
    ??????? ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//
    ??????????????? "printHello", //
    ??????????????? null, // ?
    ??????????????? null, //
    ??????????????? "void", // ?
    ??????????????? MBeanOperationInfo.INFO, //?? ?
    ??????????????? null //
    ??????? );
    ??????? // 構造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[] { // 所有的屬性信息(數組)
    ??????????????? nameAttrInfo },//只有一個屬性
    ??????????????? null, // 所有的構造函數信息 ?
    ??????????????? new ModelMBeanOperationInfo[] { // 所有的操作信息(數組)
    ????????????????????????getName,?
    ????????????????????????setName,

    ??????????????????????? print1Info,
    ??????????????????????? print2Info },//
    ??????????????? null, // 所有的通知信息(本例無)
    ??????????????? null//MBean描述子
    ??????? );
    ??????? return mbeanInfo;
    ??? }
    }
    ?
    4、看效果的方法和以前一樣,運行HelloAgent,用瀏覽器打開:http://localhost:8082 。效果圖和standard mbean一樣,就不再帖出來了,去第一篇去看吧http://blog.sohu.com/members/somebody076/545896.html
    ?
    二、總結
     
    ?? 我們發現模型Mbean(Model MBean)要比標準MBean(standard mbean)復雜多了,那有什么理由讓我們選擇使用模型MBean嗎?我認為,最大的理由就是模型MBean可以動態配置。試想一下這個應用場景:由于安全或其他原因,系統要把某個MBean公開的可管理方法隱藏起來。這時,如果你是用標準MBean,這需要修改接口類,然后重新編譯發布;如果用 Apache commons-modeler來寫的模型MBean,則只需要修改XML文件就行了,不需要重新編譯發布(可能要重啟一下系統)。這就是模型Mbean 優勢之所在了。
     
     細心的人會發現動態MBean和這一節的模型Mbean非常相似,但它們還是有很大不同的:動態MBean沒有Hello類,它要自己實現Hello類中的方法邏輯。

    posted on 2006-08-30 10:04 哼哼 閱讀(1188) 評論(6)  編輯  收藏 所屬分類: JMX

    Feedback

    # re: 6、模型Bean:Model Bean 2007-03-08 23:48 bluestar
    對于Hello MBean的 屬性name按照你的步驟,在運行時怎么不能給屬性name賦值,我給name賦值后,點擊print1Info方法打印出name為null,輸出的信息是“Hello world, null”  回復  更多評論
      

    # re: 6、模型Bean:Model Bean 2007-03-09 10:53 哼哼
    @bluestar
    沒錯,如果點擊print1Info方法,打印的是“Hello world, null”,如果點擊print2Info方法,并在whoName屬性中填寫名稱如“Tommy”,則打印的是“Hello world, Tommy”了  回復  更多評論
      

    # re: 6、模型Bean:Model Bean 2007-03-10 15:02 bluestar
    但是Hello MBean的 屬性name是可讀寫的,也就是說可以對它賦值的,可是如何才能對它賦值,然后調用print1Info方法會打印出“Hello world, (對name賦的值)”  回復  更多評論
      

    # re: 6、模型Bean:Model Bean 2007-03-13 11:07 哼哼
    @bluestar
    呵呵,不好意思,給出的程序有些問題,今天把修改后的文章發布出來,文章中粉紅色的代碼為修改的地方,您說的問題已經解決,請多提寶貴意見,謝謝支持!  回復  更多評論
      

    # re: 6、模型Bean:Model Bean 2009-10-20 17:40 吳冬冬
    博主 冒失class=Hello Hello需要將包名也寫出來  回復  更多評論
      

    # re: 6、模型Bean:Model Bean 2016-08-03 17:31 袁良錠
    好復雜呀。概念的東西,其實就是各種info,還有描述。  回復  更多評論
      

    主站蜘蛛池模板: 亚洲喷奶水中文字幕电影| 国产偷国产偷亚洲高清日韩| 亚洲美女在线观看播放| 久久精品成人免费观看97| 亚洲国产精品成人久久蜜臀| 免费国产va在线观看| 亚洲视频一区二区| 爽爽爽爽爽爽爽成人免费观看| 久久亚洲精品无码播放| 中文永久免费观看网站| 亚洲色自偷自拍另类小说| 热99RE久久精品这里都是精品免费| 亚洲国产另类久久久精品小说| 中文字幕免费观看全部电影| 亚洲区小说区图片区QVOD| APP在线免费观看视频| 亚洲人成网站在线播放影院在线| 香港a毛片免费观看| 亚洲电影免费观看| 免费人成在线视频| 美女黄频免费网站| 亚洲大尺度无码无码专区| 一个人看的www免费视频在线观看| 久久久综合亚洲色一区二区三区| 久久久久久夜精品精品免费啦| 亚洲第一永久在线观看| 美女视频黄的全免费视频网站| 亚洲成a人片在线观看天堂无码| 亚洲成av人片在线观看天堂无码 | 国产午夜不卡AV免费| 亚洲av日韩综合一区在线观看| 真人做人试看60分钟免费视频 | 亚洲欧美日韩综合久久久久| 免费一级毛片一级毛片aa| 97国免费在线视频| 亚洲男人的天堂在线| 国产老女人精品免费视频| 任你躁在线精品免费| 亚洲综合无码无在线观看 | 亚洲伊人色欲综合网| 嘿嘿嘿视频免费网站在线观看 |