欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

从零开始玩转 劳务派遣信息管理系统 JMX ( 三 ) — Model MBean

点击: 次  来源:宝鼎软件 时间:2017-08-11

原文出处: 朱小厮

Model MBean

相对付Standard MBean图纸加密,Model MBean越发机动。假如我们不能修改已有的Java类,那么利用Model MBean是不错的选择。

Model MBean也是一种专门化的动态打点构件。它是预制的、通用的和动态的 MBean 类,已经包括了所有须要缺省行为的实现,并答允在运行时添加或包围需要定制的那些实现。JMX类型划定该类必需实现为javax.management.modelmbean.RequiredModelMBean,打点者要做的就是实例化该类,并设置该构件的默认行为并注册到JMX署理中,即可实现对资源的打点。JMX署理通过得到一个ModelMBeanInfo工具来获取打点接口。
模子打点构件具有以下新的特点:

  • 耐久性。界说了耐久机制,可以操作Java的序列化或JDBC来存储模子MBean的状态。 就是要生存到硬盘上。
  • 通知和日志成果。能记录每一个发出的通知,并能自动发出属性变革通知。
  • 属性值缓存。具有缓存属性值的本领。
  • 照旧沿用前面的代码,可是这里就不需要雷同HelloMBean这样的接口了。

    package com.test.jmx.modelBean;
    
    public class Hello { //留意这里没有implements任何对象
        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);
        }
    }

    可是需要本身编写一个发生Model MBean的东西类。Model MBean利用JDK提供的RequiredModelMBean,指定根基的Bean(Hello),建设好需要的ModelMBeanInfo就可以了。

    package com.test.jmx.modelBean;
    
    
    import javax.management.*;
    import javax.management.modelmbean.*;
    
    /**
     * Created by hidden on 2016/10/9.
     */
    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 createModelerMBean() {
            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=com.test.jmx.modelBean.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=com.test.jmx.modelBean.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;
        }
    }