`
米奈希尔
  • 浏览: 269043 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JMX动态MBean示例

    博客分类:
  • JMX
 
阅读更多

  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操作时动态生成的。

 

 

 

 

分享到:
评论
1 楼 sswh 2013-11-27  
没有感觉 动态MBean有什么实际的用处?

相关推荐

    JMX模型MBean示例

    NULL 博文链接:https://jasonhan-sh-hotmail-com.iteye.com/blog/1171904

    Java分布式应用学习笔记09JMX-MBean的介绍

    ### Java分布式应用学习笔记09JMX-MBean的介绍 #### MBean概念及作用 MBean,即Managed Bean,是在JMX(Java Management Extensions)框架中用于管理资源的一种特殊Java对象。通过MBean,可以方便地对应用程序进行...

    jmx 实例 rmi mbean

    通过阅读和理解这个示例,你可以更深入地了解如何在实际项目中应用JMX RMI MBean管理。这个实例可能包括创建MBean的Java类、配置RMI的脚本或属性文件,以及演示如何从客户端进行连接和操作的测试代码。 总的来说,...

    java jmx操作示例源码

    1. **MBean接口和实现**:MBean是JMX的核心,它定义了管理接口。一个MBean可以是简单的POJO(Plain Old Java Object),提供了暴露给管理系统的方法。MBean接口通常定义了管理操作和属性,而MBean的实现则提供了具体...

    JMX以RMI方式连接的场景示例

    JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理和监控应用程序。JMX框架主要由三部分组成:MBean(Managed Bean)、Agent(代理)和Client(客户端)。在本场景中,我们将...

    JMX HelloWorld Download

    6. **JMX Hello World示例**:通常,这个示例会包含一个简单的MBean,该MBean有一个或多个操作(方法),可能还有属性。用户可以通过JConsole或其他可视化工具来访问和操作这个MBean,例如,显示一条“Hello World”...

    JMX实用例子详解(包括各种Mbean)

    在"jmx_examples"压缩包中,可能包含了以上各个方面的代码示例,通过这些示例,读者可以更直观地理解和应用JMX技术。学习和实践这些例子,能够帮助开发者更好地利用JMX来管理和监控复杂的Java系统。

    最简单JMX例子

    本示例是一个简单的JMX实现,适合初学者理解JMX的基本概念和工作原理。 首先,我们来了解JMX的核心组件: 1. **MBean**(Managed Beans):MBean是JMX中的管理对象,代表了可管理的资源。它可以是任何Java对象,...

    JMX小例子以及介绍

    下面是一个简单的JMX示例,展示如何创建一个MBean,注册到MBean Server,并通过JConsole进行管理: ```java import javax.management.*; public class MyManagedBean implements DynamicMBean { private final ...

    jmx_examples.rar_Java 8_jmx_jmx examples_jmx main_jmx_examples

    JMX允许开发者创建管理接口,以便对运行时的组件进行动态监控和管理。在这个"jmx_examples.rar"压缩包中,包含了多个JMX的简单示例,这将帮助我们了解如何在Java 8中使用JMX。 1. **JMX基础知识**: - JMX的核心...

    Jmx实例demo下载

    6. **客户端示例**:项目可能还包含一个简单的客户端示例,展示了如何使用JMX API连接到MBean服务器,查询MBean信息,调用其操作,以及监控和改变MBean的属性。 通过分析`jmxdemo`项目的源代码,你可以学习如何创建...

    JMX IN ACTION(十二)

    JMX兼容的代理提供了一组标准MBean,这些MBean构成了JMX的监控服务。由于这些监控器是以MBean的形式实现的,用户可以在运行时根据需要实例化和修改它们。监控MBean的目标是其他MBean的属性,它们会监视预定义的事件...

    jmx一步步来 jmx快速上手指南

    通过上述示例可以看出,JMX通过定义MBean接口和其实现类的方式,使得我们能够通过标准的方法来管理和监控应用程序。这种方式不仅提高了应用程序的可管理性,同时也降低了管理操作的复杂度。 #### 六、总结 JMX作为...

    网络管理之jmx开发实战

    #### Timer MBean示例 下面是一个使用Timer MBean的示例: 1. **在mlet配置文件中添加Timer MBean**: ```xml &lt;MLET CODE="javax.management.timer.Timer" NAME="DefaultDomain:service=Timer" ARCHIVE="jmxri....

    jmx osgi 实例

    通过分析和运行这个示例,开发者可以更深入地理解JMX与OSGi的集成,并将其应用于自己的项目中,以实现更灵活、可扩展的系统管理。 总之,JMX和OSGi的结合为Java应用程序提供了强大的管理和模块化能力。通过这个实例...

    jmx in action

    - 通过具体的示例演示了如何通过 JMX Agent 远程管理 MBean 服务器。 - 包括如何查询 MBean 属性、调用操作方法等。 #### 十、高级 MBean 加载技术 - **MBean 加载机制**: - 深入探讨了 MBean 的加载过程以及...

    《jmx技术介绍》配套源代码

    《JMX技术介绍》一书显然是为了深入探讨这一技术而编写的,配套源代码则提供了实践示例,帮助读者更好地理解和应用JMX。 1. JMX架构: JMX架构由管理代理(MBeans)、服务提供者接口(MBean Server)和管理客户端...

    jmxdemo.rar

    jmxdemo.rar是一个包含JMX服务端和客户端的示例,帮助我们理解如何利用JMX进行远程监控Java项目,而VisualVM是一个强大的Java诊断工具,它可以利用JMX进行远程连接和监控。 首先,我们需要了解JMX的基本概念。JMX的...

    JAVA JMX 学习资料

    Java自带的JConsole是JMX的一个示例客户端,它可以连接到本地或远程的JVM,并可视化地展示MBean的信息,进行监控和管理。 7. **JMX的应用场景**: JMX常用于服务器监控,如内存使用、线程状态、JDBC连接池等。在...

    JMX 入门 详细 教程

    4. **Management Agents**: JMX 还包括Management Agents,它们负责暴露MBean Server,使远程客户端能够访问和管理MBean。例如,使用JMX Remote API,可以跨网络远程管理Java应用程序。 5. **Web-Based UI**: JMX ...

Global site tag (gtag.js) - Google Analytics