`

JMX—标准MBean和模型MBean演示

    博客分类:
  • Java
阅读更多
一共有四种MBean:

    标准MBean(Standard MBeans)设计和实现是最简单的,这类MBean使用自己的方法名作为管理接口。

    动态MBean(Dynamic MBeans)必须实现一个指定的接口,由于动态MBeans在运行期间暴露它们的管理接口,因此更为灵活。

    开放MBean(Open MBeans)属于动态MBeans,这类MBean依靠基础数据类型来实现通用管理,并为友情用户进行自我声明。

    模型MBean(Model MBeans)同样也是动态MBeans,这类MBeans是完全可配置的,在运行期间进行自我声明;它们为资源动态工具提供一个一般性的,有默认行为的MBeans类。

下面将演示标准MBean和模型MBean的使用方法。

以下演示的源码地址:https://github.com/smallbug-vip/repo,除此之外自己在网上还搜索了一个动态MBean的Demo。
标准MBean

首先定义被管理的bean:
public class Bug implements BugMBean{

	private String name;
	private String food;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getFood() {
		return food;
	}

	public void setFood(String food) {
		this.food = food;
	}

	public void eat(String eat) {
		System.out.println("the bug is eating " + eat + ".");
	}

	@Override
	public String toString() {
		return "Bug [name=" + name + ", food=" + food + "]";
	}

}

该Bean实现了一个名称以MBean结尾的接口,这个接口中声明的方法都是Bean对象要向外暴露的操作接口方法。
public interface BugMBean {
	/**
	 * 获取名字
	 * 
	 * @timestamp Feb 10, 2016 3:22:58 PM
	 * @return
	 */
	public String getName();

	/**
	 * 设置名字
	 * 
	 * @timestamp Feb 10, 2016 3:23:23 PM
	 * @param name
	 */
	public void setName(String name);

	/**
	 * 最喜欢的食物是什么
	 * 
	 * @timestamp Feb 10, 2016 3:23:37 PM
	 * @return
	 */
	public String getFood();

	/**
	 * 设置最喜欢的食物
	 * 
	 * @timestamp Feb 10, 2016 3:23:55 PM
	 * @param food
	 */
	public void setFood(String food);

	/**
	 * 吃
	 * 
	 * @timestamp Feb 10, 2016 3:24:08 PM
	 * @param eat
	 */
	public void eat(String eat);

	/**
	 * 查看状态
	 * 
	 * @timestamp Feb 10, 2016 3:24:15 PM
	 * @return
	 */
	public String toString();
}

使用工具Adaptor测试代码:
try {
			helloName = new ObjectName("smallbug:name=Bug");
			server.registerMBean(new Bug(), helloName);

			ObjectName adapterName = new ObjectName("StandardAgent:name=htmladapter,port=8082");
			HtmlAdaptorServer adapter = new HtmlAdaptorServer();
			server.registerMBean(adapter, adapterName);
			adapter.start();
			System.out.println("start.....");
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

之后可以在浏览器中输入:localhost:8082来管理Bug对象了。注意要使用HtmlAdaptorServer必须在pom.xml中引入:
<dependency>
			<groupId>com.sun.jdmk</groupId>
			<artifactId>jmxtools</artifactId>
			<version>1.2.1</version>
		</dependency>

也可以不使用Adapter:
private void test02() {
		try {
			helloName = new ObjectName("smallbug:name=Bug");
			server.registerMBean(new Bug(), helloName);

			changeProperties();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	private void changeProperties() {
		Attribute name = new Attribute("Name", "smallbug");
		Attribute food = new Attribute("Food", "leaves");
		try {
			server.setAttribute(helloName, name);
			server.setAttribute(helloName, food);

			System.out.println("the name is " + server.getAttribute(helloName, "Name"));
			Object[] params = { "beans" };
			String[] sign = { "java.lang.String" };
			server.invoke(helloName, "eat", params, sign);
			String s = (String) server.invoke(helloName, "toString", null, null);
			System.out.println(s);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

模板MBean
被管理Bean除了不实现接口,其他与上面Bug一样。然后定义BugMBean类,该类继承了BaseModelMBean:
public class BugMBean extends BaseModelMBean {

	public BugMBean() throws MBeanException, RuntimeOperationsException {
		super();
	}

	@Override
	public String getClassName() {

		return (this.resource.getClass().getName());

	}

	@Override
	public Object getAttribute(String name) throws AttributeNotFoundException, MBeanException, ReflectionException {
		System.out.println("-------------------" + name);
		return super.getAttribute(name);
	}

	@Override
	public void setAttribute(Attribute attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {
		System.out.println("+++++++++++++++++++" + attribute);
		super.setAttribute(attribute);
	}

}

对需要暴露的接口进行配置:
<?xml version="1.0"?>
<!DOCTYPE mbeans-descriptors PUBLIC
 "-//Apache Software Foundation//DTD Model MBeans Configuration File"
 "http://jakarta.apache.org/commons/dtds/mbeans-descriptors.dtd">

<mbeans-descriptors>

	<mbean name="myMBean" className="cn.smallbug.jdk.jmx._02.BugMBean"
		type="cn.smallbug.jdk.jmx._02.Bug">

		<attribute name="Name" type="java.lang.String" />
		<attribute name="Food" type="java.lang.String" />
		
		<operation name="eat" impact="ACTION" returnType="void">
			<parameter name="eat" type="java.lang.String" />
		</operation>
		
		<operation name="toString" impact="ACTION" returnType="java.lang.String">
			<parameter name="eat" type="java.lang.String" />
		</operation>
	</mbean>

</mbeans-descriptors>


测试:
public class ModelAgent {
	private Registry registry;
	private MBeanServer mBeanServer;

	public ModelAgent() {
		registry = createRegistry();
		try {
			mBeanServer = Registry.getServer();
		} catch (Throwable t) {
			t.printStackTrace(System.out);
			System.exit(1);
		}
	}

	public MBeanServer getMBeanServer() {
		return mBeanServer;
	}

	public Registry createRegistry() {
		Registry registry = null;
		try {
			URL url = ModelAgent.class.getResource("/jmx/bug-mbean.xml");
			InputStream stream = url.openStream();
			Registry.loadRegistry(stream);
			stream.close();
			registry = Registry.getRegistry();
		} catch (Throwable t) {
			System.out.println(t.toString());
		}
		return (registry);
	}

	public ModelMBean createModelMBean(String mBeanName) throws Exception {
		ManagedBean managed = registry.findManagedBean(mBeanName);
		if (managed == null) {
			System.out.println("ManagedBean null");
			return null;
		}
		ModelMBean mbean = managed.createMBean();
		ObjectName objectName = createObjectName();
		return mbean;
	}

	private ObjectName createObjectName() {
		ObjectName objectName = null;
		String domain = mBeanServer.getDefaultDomain();
		try {
			objectName = new ObjectName(domain + ":type=MyCar");
		} catch (MalformedObjectNameException e) {
			e.printStackTrace();
		}
		return objectName;
	}

	public static void main(String[] args) {
		ModelAgent agent = new ModelAgent();
		MBeanServer mBeanServer = agent.getMBeanServer();
		Bug bug = new Bug();
		System.out.println("Creating ObjectName");
		ObjectName objectName = agent.createObjectName();
		try {
			ModelMBean modelMBean = agent.createModelMBean("myMBean");
			modelMBean.setManagedResource(bug, "ObjectReference");
			mBeanServer.registerMBean(modelMBean, objectName);
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		// manage the bean
		try {
			Attribute name = new Attribute("Name", "smallbug");
			Attribute food = new Attribute("Food", "leaves");
			mBeanServer.setAttribute(objectName, name);
			mBeanServer.setAttribute(objectName, food);
			String color = (String) mBeanServer.getAttribute(objectName, "Name");
			System.out.println("Name:" + color);

			Object[] params = { "beans" };
			String[] sign = { "java.lang.String" };
			mBeanServer.invoke(objectName, "eat", params, sign);
			String s = (String) mBeanServer.invoke(objectName, "toString", null, null);
			System.out.println(s);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

0
0
分享到:
评论

相关推荐

    JMX模型MBean示例

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

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

    MBean主要分为两种类型:Standard MBean和Dynamic MBean。 ##### Standard MBean Standard MBean是最常见的MBean类型,它要求实现特定的接口,并遵循一定的命名约定。通常情况下,开发者只需要编写一个普通的...

    jmx 实例 rmi mbean

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备等资源。它提供了一种灵活的框架,允许开发者创建、注册和管理名为Managed Beans(MBeans)的对象,这些...

    Druid数据源连接池;mybatis配置集成,多数据源;jmx监控MBean;

    Druid数据源连接池;mybatis配置集成,多数据源;jmx监控MBean;定时任务配置;aop_spring-boot-service

    JMX(一)-------MBean server

    总的来说,JMX和MBean Server提供了一种标准、灵活的管理方式,使得Java应用的管理和监控变得更加便捷。通过结合Spring框架,开发者可以更轻松地在应用中集成JMX功能,实现对应用的全方位管理。

    jmx mbean学习 jmxtools下载

    JMX 1.2.1 Reference Implementation(重点) Include com.sun.jdmk.comm.HtmlAdaptorServer class http://www.sun.com/software/jdmk/ Downloads, sun-jdmk-runtime-5.1-b34.2.zip/SUNWjdmk/5.1/lib/jdmkrt.jar

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

    java

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

    Java Management Extensions(JMX)是Java平台上的一个标准管理框架,它允许开发人员创建、注册和管理名为MBeans(Managed Beans)的对象,这些对象代表了系统、应用程序或服务的可管理资源。通过JMX,我们可以远程...

    JMX IN ACTION(四)

    在本章《JMX实战(四)》中,我们将深入探讨最简单的MBean类型:标准MBean。标准MBean适用于具有稳定、已知接口的资源。这一章将介绍如何使用标准MBean来配置应用程序资源(如日志工具和应用属性),以及如何将应用...

    jmx资料

    MBeans有三种类型:标准MBean、模型MBean和动态MBean。标准MBean通过特定的接口定义其管理属性和操作;模型MBean根据运行时的元数据自动生成接口;动态MBean则允许在运行时动态定义MBean的行为。 3. **MBean服务器*...

    jmxri.jar和jmxtools.jar 1.2.1

    MBean可以是标准MBean、模型MBean或开放MBean,它们通过实现特定接口或使用特定注解来暴露其属性、操作和通知。 - **MBean Server**:MBean Server是JMX架构的核心,负责管理MBean的生命周期,包括创建、注册、查找...

    书籍JMX-IN-ACTION

    接着,书中的章节详细讲述了如何创建自定义MBean,包括标准MBean、开放MBean和模型MBean的不同类型,以及它们的注册和管理过程。此外,书中还讨论了MBean服务器的选择和配置,如内置MBean服务器和远程MBean服务器的...

    JMX小例子以及介绍

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备。它提供了一种统一的方式来创建、配置、查询和管理Java应用中的资源。本篇文章将深入探讨JMX的核心概念...

    论文研究-JMX技术在网络监控中的应用.pdf

    MBean分为标准MBean、动态MBean、开放MBean和模型MBean等不同类型,它们分别适用于不同的监控和管理场景。 JMX技术的另一个重要概念是通知。通知是JMX框架用来实现异步通信的一种机制。当MBean的某个属性发生变化,...

    jmx 入门文档,附有开发实例文档

    3. **模型MBean**:模型MBean通过元数据描述其属性、操作和通知,这样可以更灵活地处理各种类型的MBean,而无需为每个MBean创建单独的接口。 4. **开放MBean**:开放MBean提供了一种标准的数据类型和转换机制,使得...

    JMX HelloWorld Download

    有标准MBean、模型MBean和动态MBean三种类型。 3. **MBean Server**:MBean Server是JMX框架的中心,负责注册MBean、执行MBean的操作以及处理MBean之间的交互。 4. **JMX连接器**:JMX连接器允许远程客户端连接到...

    jmx技术介绍(ppt)

    MBean是JMX的核心元素,分为标准MBean和动态MBean。标准MBean适用于定义明确、稳定的资源,它们基于Java Bean模式,通过内省机制获取属性和方法信息。动态MBean则提供了更大的灵活性,包括Open MBean和Model MBean,...

    JMX与Spring 结合

    **JMX(Java Management Extensions)** 是Java平台提供的一种管理和监控的标准框架,它允许开发者对应用程序、设备和服务进行管理,提供了动态发现、监控和管理的能力。JMX 可以帮助我们远程控制应用,查看其运行...

    jmx.rar_jmx

    有标准MBean、开放MBean、模型MBean和动态MBean四种类型,它们各有不同的创建和使用方式。 2. **MBeanServer**:MBeanServer是JMX架构的核心组件,负责注册、管理MBean以及处理MBean之间的交互。开发者可以通过...

    基于Spring+JMX+Tomcat实现资源动态管理

    Java Management Extensions (JMX) 是Java平台的一个标准API,用于创建、管理和监控各种资源,如Java应用程序、网络设备、操作系统等。JMX提供了一种标准的方式来注册MBeans(Managed Beans),这些MBeans是代表可...

Global site tag (gtag.js) - Google Analytics