JMX动态MBean示例
? JMX管理构件(MBean)分为四种形式,分别是标准管理构件(Standard MBean)、动态管理构件(Dynamic MBean)、开放管理构件(Open Mbean)和模型管理构件(Model MBean)。本文即是对动态管理构件(Dynamic MBean)的演示说明。
? 动态管理构件的最大的特点是可以在运行期暴露自己的管理接口,因此具有更好的灵活性。它的实现是通过实现一个特定的接口DynamicMBean。
?示例参照http://bluestar.iteye.com/blog/58083实现,小作修改,写在此处只为方面查阅。
?
HelloDynamic,实现了DynamicMBean接口的管理控件(Mbean)
?
package com.jmxdemo.dynamic;import java.lang.reflect.Constructor;import javax.management.Attribute;import javax.management.AttributeList;import javax.management.AttributeNotFoundException;import javax.management.DynamicMBean;import javax.management.InvalidAttributeValueException;import javax.management.MBeanAttributeInfo;import javax.management.MBeanConstructorInfo;import javax.management.MBeanException;import javax.management.MBeanInfo;import javax.management.MBeanNotificationInfo;import javax.management.MBeanOperationInfo;import javax.management.MBeanParameterInfo;import javax.management.ReflectionException;public class HelloDynamic implements DynamicMBean {// 管理控件(MBean)属性private String name;// 动态创建MBean需要的变量private String className = this.getClass().getName();private String description = "Simple implementation of a dynamic MBean.";private MBeanAttributeInfo[] attributes;private MBeanConstructorInfo[] constructors;private MBeanOperationInfo[] operations;private MBeanInfo mBeanInfo;private MBeanNotificationInfo[] notifications;public HelloDynamic() {init();buildDynamicMBean();}private void init() {className = this.getClass().getName();description = "Simple implementation of a dynamic MBean.";attributes = new MBeanAttributeInfo[1];constructors = new MBeanConstructorInfo[1];operations = new MBeanOperationInfo[1];notifications = new MBeanNotificationInfo[0];}private void buildDynamicMBean() {// constructorsConstructor<?>[] ctors = this.getClass().getConstructors();constructors[0] = new MBeanConstructorInfo("HelloDynamic(): Constructs a HelloDynamic object", ctors[0]);// attributesattributes[0] = new MBeanAttributeInfo("name", "java.lang.String","Name: name string", true, true, false);// methodsMBeanParameterInfo[] params = null;operations[0] = new MBeanOperationInfo("print","print(): print the name", params, "void",MBeanOperationInfo.INFO);// MBeanInfomBeanInfo = new MBeanInfo(this.className, description, attributes,constructors, operations, notifications);}@Overridepublic Object getAttribute(String attribute)throws AttributeNotFoundException, MBeanException,ReflectionException {if (attribute == null) {return null;}if ("name".equals(attribute)) {return name;}return null;}@Overridepublic AttributeList getAttributes(String[] attributes) {if (attributes == null) {return null;}AttributeList reslist = new AttributeList();for (String attr : attributes) {try {Object value = getAttribute(attr);reslist.add(new Attribute(attr, value));} catch (Exception e) {e.printStackTrace();}}return reslist;}@Overridepublic MBeanInfo getMBeanInfo() {return mBeanInfo;}@Overridepublic Object invoke(String actionName, Object[] params, String[] signature)throws MBeanException, ReflectionException {if (actionName.equals("print")) {print();} else if("dynamicPrint".equals(actionName)) {dynamicPrint();}return null;}@Overridepublic void setAttribute(Attribute attribute)throws AttributeNotFoundException, InvalidAttributeValueException,MBeanException, ReflectionException {if (attribute == null) {return;}String attrname = attribute.getName();Object attrvalue = attribute.getValue();if ("name".equals(attrname)) {if (attrvalue == null) {name = null;} elsetry {if (Class.forName("java.lang.String").isAssignableFrom(attrvalue.getClass())) {name = (String) attrvalue;}} catch (ClassNotFoundException e) {e.printStackTrace();}}}@Overridepublic AttributeList setAttributes(AttributeList attributes) {if (attributes == null) {return null;}AttributeList reslist = new AttributeList();for (Object obj : attributes) {Attribute attr = (Attribute) obj;try {setAttribute(attr);String attrname = attr.getName();Object attrvalue = attr.getValue();reslist.add(new Attribute(attrname, attrvalue));} catch (Exception e) {e.printStackTrace();}}return reslist;}private void print() {System.out.println("Hello " + name + ", This is helloDynamic");// add method dynamic at runtimeoperations = new MBeanOperationInfo[2];buildDynamicMBean();MBeanParameterInfo[] parameters = null;operations[1] = new MBeanOperationInfo("dynamicPrint","dynamicPrint: Runtime generated by print method", parameters,"void", MBeanOperationInfo.INFO);}private void dynamicPrint() {System.out.println("This is a runtime generated method!");}}??
?
HelloDynamicAgent.java
?
package com.jmxdemo.dynamic;import javax.management.InstanceAlreadyExistsException;import javax.management.MBeanRegistrationException;import javax.management.MBeanServer;import javax.management.MBeanServerFactory;import javax.management.MalformedObjectNameException;import javax.management.NotCompliantMBeanException;import javax.management.ObjectName;import com.sun.jdmk.comm.HtmlAdaptorServer;public class HelloDynamicAgent {private static String DOMAIN = "MyDynamicMBean";/** * @param args * @throws NullPointerException * @throws MalformedObjectNameException * @throws NotCompliantMBeanException * @throws MBeanRegistrationException * @throws InstanceAlreadyExistsException */public static void main(String[] args) throws MalformedObjectNameException, NullPointerException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {//创建一个MBean服务对象,DOMAIN类似于java里面的公共package部分MBeanServer server = MBeanServerFactory.createMBeanServer(DOMAIN);//创建DynamicMBean对象HelloDynamic hello = new HelloDynamic();//创建一个web适配器服务器,表示我们MBean服务通过web形式来提供给用户管理HtmlAdaptorServer htmlserver = new HtmlAdaptorServer();htmlserver.setPort(9999);//ObjctName对象类似于完整的packageObjectName helloname = new ObjectName(DOMAIN + ":name=HelloDynamic");ObjectName htmlname = new ObjectName(DOMAIN + ":name=HtmlAdaptor");server.registerMBean(hello, helloname);server.registerMBean(htmlserver, htmlname);htmlserver.start();}}???
?
运行程序,打开浏览器,输入http://localhost:9999,即可访问管理页面,页面下方点击name=HelloDynamic,进入MBean View,然后再操作中点击print方法,再次回到MBean View页面你会发现多了一个dynamicPrint方法,这个方法就是我们进行print操作时动态生成的。
?
?
?
?