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;
}
}