Model MBean
相对付Standard MBean,图纸加密,Model MBean越发机动。假如我们不能修改已有的Java类,那么利用Model MBean是不错的选择。
Model MBean也是一种专门化的动态打点构件。它是预制的、通用的和动态的 MBean 类,已经包括了所有须要缺省行为的实现,并答允在运行时添加或包围需要定制的那些实现。JMX类型划定该类必需实现为javax.management.modelmbean.RequiredModelMBean,打点者要做的就是实例化该类,并设置该构件的默认行为并注册到JMX署理中,即可实现对资源的打点。JMX署理通过得到一个ModelMBeanInfo工具来获取打点接口。
模子打点构件具有以下新的特点:
照旧沿用前面的代码,可是这里就不需要雷同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; } }