欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JMX动态MBean示例

程序员文章站 2022-06-10 08:56:49
...

  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() {
		// constructors
		Constructor<?>[] ctors = this.getClass().getConstructors();
		constructors[0] = new MBeanConstructorInfo(
				"HelloDynamic(): Constructs a HelloDynamic object", ctors[0]);
		// attributes
		attributes[0] = new MBeanAttributeInfo("name", "java.lang.String",
				"Name: name string", true, true, false);
		// methods
		MBeanParameterInfo[] params = null;
		operations[0] = new MBeanOperationInfo("print",
				"print(): print the name", params, "void",
				MBeanOperationInfo.INFO);
		// MBeanInfo
		mBeanInfo = new MBeanInfo(this.className, description, attributes,
				constructors, operations, notifications);
	}

	@Override
	public Object getAttribute(String attribute)
			throws AttributeNotFoundException, MBeanException,
			ReflectionException {
		if (attribute == null) {
			return null;
		}
		if ("name".equals(attribute)) {
			return name;
		}
		return null;
	}

	@Override
	public 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;
	}

	@Override
	public MBeanInfo getMBeanInfo() {
		return mBeanInfo;
	}

	@Override
	public Object invoke(String actionName, Object[] params, String[] signature)
			throws MBeanException, ReflectionException {
		if (actionName.equals("print")) {
			print();
		} else if("dynamicPrint".equals(actionName)) {
			dynamicPrint();
		}
		return null;
	}

	@Override
	public 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;
			} else
				try {
					if (Class.forName("java.lang.String").isAssignableFrom(
							attrvalue.getClass())) {
						name = (String) attrvalue;
					}
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
		}

	}

	@Override
	public 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 runtime
		operations = 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对象类似于完整的package
		ObjectName 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操作时动态生成的。