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

JMX模型MBean示例

    博客分类:
  • JMX
 
阅读更多

  模型MBean是一种通用的、可配置的MBean,任何人可以用它来快速转化任何资源。模型MBean是一种动态MBean,实现了指定的接口。这些接口定义的结构,在实现这些接口时,提供了一个实例化MBean的默认的和可配置的行为。

  关于模型MBean的理解不是本文重点,下面是一个参考,当然最好的方式是看JMX规范:

http://www.51testing.com/?uid-43487-action-viewspace-itemid-98380 

 

  环境:JMX1.2 JDK1.6

 

1. Hello.java

 

package com.jmxdemo.model;

public class Hello {
	private String name;

	public Hello() {
		super();
	}

	public String getName() {
		return name;
	}

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

	public void print() {
		System.out.println("Hello " + name + "!");
	}

}

  

  Hello是被管理对象,不要求实现以MBean结尾的接口,MBeanServer通过RequiredModelMBean来对其进行管理,在HelloModel.java中我们可以看到Hello和RequiredModelMBean是通过何种方式关联的。

 

 

2. HelloModel.java

 

package com.jmxdemo.model;

import java.lang.reflect.Constructor;

import javax.management.Descriptor;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.RuntimeOperationsException;
import javax.management.modelmbean.DescriptorSupport;
import javax.management.modelmbean.InvalidTargetObjectTypeException;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanConstructorInfo;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;
import javax.management.modelmbean.ModelMBeanOperationInfo;
import javax.management.modelmbean.RequiredModelMBean;

public class HelloModel {
	public static RequiredModelMBean createModelBean()
			throws RuntimeOperationsException, MBeanException,
			InstanceNotFoundException, InvalidTargetObjectTypeException {
		// 模型MBean信息
		ModelMBeanInfo info = buildModelMBeanInfo();
		// 模型MBean
		RequiredModelMBean modelMBean = new RequiredModelMBean(info);
		modelMBean.setManagedResource(new Hello(), "ObjectReference");
		return modelMBean;
	}

	protected static ModelMBeanInfo buildModelMBeanInfo() {
		// --
		// attributes
		// ------------------------------------------------------------------
		ModelMBeanAttributeInfo[] attributes = new ModelMBeanAttributeInfo[1];

		// name attribute
		Descriptor nameDesc = new DescriptorSupport();
		nameDesc.setField("name", "name");
		nameDesc.setField("displayName", "myname");
		nameDesc.setField("setMethod", "setName");
		nameDesc.setField("getMethod", "getName");
		nameDesc.setField("descriptorType", "attribute");
		attributes[0] = new ModelMBeanAttributeInfo("name", "java.lang.String",
				"name say hello to", true, true, false, nameDesc);

		// --
		// operations
		// -------------------------------------------------------------------
		ModelMBeanOperationInfo[] operations = new ModelMBeanOperationInfo[3];
		String className = Hello.class.getName();

		// setName method
		MBeanParameterInfo[] setNameParams = new MBeanParameterInfo[] { new MBeanParameterInfo(
				"name", "java.lang.String", "name say hello to") };
		Descriptor setNameDesc = new DescriptorSupport(new String[] {
				"name=setName", "descriptorType=operation",
				"class=" + className, "role=operation" });
		operations[0] = new ModelMBeanOperationInfo("setName", "set name",
				setNameParams, "void", MBeanOperationInfo.ACTION, setNameDesc);

		// getName method
		Descriptor getNameDesc = new DescriptorSupport(new String[] {
				"name=getName", "descriptorType=operation",
				"class=" + className, "role=operation" });
		operations[1] = new ModelMBeanOperationInfo("getName", "get name",
				null, "java.lang.String", MBeanOperationInfo.ACTION,
				getNameDesc);

		// print method
		Descriptor printDesc = new DescriptorSupport(new String[] {
				"name=print", "descriptorType=operation", "class=" + className,
				"role=operation" });
		operations[2] = new ModelMBeanOperationInfo("print", "print name",
				null, "void", MBeanOperationInfo.ACTION, printDesc);

		// --
		// constructors
		// ----------------------------------------------------------------------
		ModelMBeanConstructorInfo[] constructors = new ModelMBeanConstructorInfo[1];
		Constructor<?>[] ctors = Hello.class.getConstructors();

		// default constructors
//		Descriptor helloDesc = new DescriptorSupport();
//		helloDesc.setField("name", "Hello");
//		helloDesc.setField("descriptorType", "operation");
//		helloDesc.setField("role", "constructor");
//		helloDesc.setField("displayName", "Hello");
//		constructors[0] = new ModelMBeanConstructorInfo(
//				"Hello(): Constructs a Hello Object", ctors[0], helloDesc);

		constructors[0] = new ModelMBeanConstructorInfo("default constructor",
				ctors[0], null);

		// ModelMBeanInfo
		ModelMBeanInfo mmbeanInfo = new ModelMBeanInfoSupport(className,
				"Simple implementation of model bean.", attributes, null,
				operations, null, null);

		return mmbeanInfo;
	}
}

  将Hello管理对象和RequiredModelMBean进行管理,提供给MBeanServer

 

ModelAgent.java

package com.jmxdemo.model;

import java.io.IOException;
import java.rmi.registry.LocateRegistry;

import javax.management.InstanceAlreadyExistsException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.RuntimeOperationsException;
import javax.management.modelmbean.InvalidTargetObjectTypeException;
import javax.management.modelmbean.RequiredModelMBean;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

import com.sun.jdmk.comm.HtmlAdaptorServer;

public class ModelAgent {
	public static final String DOMAIN = "MyModelMBean";

	public static void main(String[] args) throws RuntimeOperationsException,
			InstanceNotFoundException, MBeanException,
			InvalidTargetObjectTypeException, MalformedObjectNameException,
			NullPointerException, InstanceAlreadyExistsException,
			NotCompliantMBeanException, IOException {
		// mbean server
		MBeanServer server = MBeanServerFactory.createMBeanServer(DOMAIN);
		// register hello model mbean
		RequiredModelMBean hello = HelloModel.createModelBean();
		ObjectName helloname = new ObjectName(DOMAIN + ":name=helloModel");
		server.registerMBean(hello, helloname);

		// manage MBeans via web
		HtmlAdaptorServer htmlAdaptor = new HtmlAdaptorServer();
		htmlAdaptor.setPort(9998);
		ObjectName htmlname = new ObjectName(DOMAIN + ":name=htmlAdaptor");
		server.registerMBean(htmlAdaptor, htmlname);

		htmlAdaptor.start();
		System.out.println("html adaptor start...");

		// manage MBeans via RMI
		LocateRegistry.createRegistry(9999);
		JMXServiceURL url = new JMXServiceURL(
				"service:jmx:rmi:///jndi/rmi://localhost:9999/mserver");
		JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
		
		cs.start();
		System.out.println("RMI start...");
	}
}

 通过Http和RMI两种方式提供远程访问功能。

 

测试:

  1. 打开浏览器输入http://localhost:9998/进行管理

  2.在jconsole远程连接中输入RMI访问地址,

     即service:jmx:rmi:///jndi/rmi://localhost:9999/mserver,进入管理界面进行管理。

  ps:打开jconsole方式

       如果配置了JAVA_HOME,则打开命令行,输入jconsole即可;

       在JDK安装目录下的bin目录中找到jconsole.exe,打开即可

 

问题:

在HelloModel.java中如果把constructors[0] = new ModelMBeanConstructorInfo("default constructor", ctors[0], null);换成注释部分,程序会报下面错误,找不到解决办法。

 

Exception in thread "main" javax.management.RuntimeOperationsException: Exception occurred in ModelMBeanConstructorInfo constructor
 at javax.management.modelmbean.ModelMBeanConstructorInfo.<init>(Unknown Source)
 at com.jmxdemo.model.HelloModel.buildModelMBeanInfo(HelloModel.java:91)
 at com.jmxdemo.model.HelloModel.createModelBean(HelloModel.java:25)
 at com.jmxdemo.model.ModelAgent.main(ModelAgent.java:34)
Caused by: java.lang.IllegalArgumentException: Invalid descriptor passed in parameter
 ... 4 more


 如解决,请告知,3Q!!!

分享到:
评论

相关推荐

    JMX HelloWorld Download

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

    JMX小例子以及介绍

    MBean可以是标准MBean、开放MBean或模型MBean,每种类型都有不同的接口和注册方式。 - **MBean Server**: 这是JMX的核心组件,负责注册、查询和操作MBean。它是一个运行在Java虚拟机中的服务,可以托管MBean并提供...

    jmx_in_action随书源码

    1. **基础MBean示例**:这些示例展示了如何定义和实现简单的MBeans,包括标准MBeans、开放MBeans和模型MBeans,以及它们如何注册到MBeanServer。 2. **MBean代理**:代码可能包含使用JMX API创建MBean代理类的示例...

    JMX入门的好资料啊

    此外,“src”目录可能包含了示例代码,帮助读者理解如何在实践中实现JMX功能。这些代码可能展示了如何定义MBeans、注册它们到MBean服务器,以及如何通过JMX API执行管理操作。 学习JMX有助于开发者在遇到性能问题...

    jmx_examples.zip_jmx_examples

    在"jmx_examples.zip_jmx_examples"这个压缩包中,我们可能会找到一系列示例代码,这些代码展示了如何利用JMX在Java 5.0及更高版本中实现管理功能。 JMX的核心概念包括MBeans(Managed Beans)、代理(Agents)和...

    使用RMI远程连接JVM.用JMX获取JVM的参数

    "Hello.java"和"HelloWorld.java"可能是示例类,用于演示RMI和JMX的使用。它们可能包含了简单的远程方法,或者展示了如何创建和注册MBean。 为了实现远程连接JVM并获取JVM参数,首先需要在服务器端启动JMX服务,并...

    JMX需要的JAR和文档和可运行的例子

    `JmxEgs.rar`可能是一个压缩包,包含了JMX的示例代码和案例研究,这对于初学者来说是非常宝贵的资源。你可以通过解压这个文件,阅读代码并运行例子来更好地理解JMX的工作原理。例如,你可能会看到如何创建和注册...

    jmx in action

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

    JMX.rar_jmx_osgi

    6. **JMX安全性**:为了保护管理系统免受未经授权的访问,JMX支持安全模型。可以通过配置访问控制限制谁可以访问MBeans,以及可以执行哪些操作。 7. **JMX编程**:创建MBeans通常涉及定义接口或类,然后注册到...

    JMX IN ACTION(二)

    在本章节“JMX IN ACTION(二)”中,我们将...接下来的章节将深入探讨更复杂的JMX功能,如远程管理、安全管理以及使用标准MBeans和模型MBeans等。理解这些概念将使你能够充分利用JMX来管理和监控复杂的Java应用程序。

    JMX in Action

    - **模型 MBean**: 通过 XML 文件定义其接口的 MBean。 - **动态 MBean**: 实现 `DynamicMBean` 接口的 MBean,可以动态地添加和删除属性及操作。 2. **MBean 属性**: MBeans 可以包含多种属性,这些属性可以被...

    JMX_in_Action源码

    2. **MBeanServer**:MBeanServer是JMX架构的关键组件,它负责注册MBeans、执行MBean的操作、查询MBean信息等。源码会展示如何创建和使用MBeanServer。 3. **MBean代理(MBean Proxy)**:源码中可能包含了代理类,...

    jmx tool jar 备用

    在Java中,JMX允许我们创建管理模型、注册MBeans(Managed Beans),这些MBeans代表了应用程序中的可管理资源,如系统状态、性能指标等。MBeans可以是标准的、开放的或私有的,它们通过MBeanServer进行注册,然后...

    jmx-whitepaper

    由于本文档主要基于JMX的基本原理和技术示例编写,因此未引用具体的研究文献。然而,对于希望深入了解JMX的读者,建议查阅官方文档和其他相关的技术资料。 ©luminis®- 使用JMX提升软件可管理性

    JMX specification 1.4

    #### 五、JMX 规范的应用示例 例如,在一个分布式系统中,可以使用JMX来集中监控各个节点的状态,并根据实际情况进行资源调度和故障转移。又比如,在一个Web服务器集群中,管理员可以通过JMX远程监控每个服务器的...

    很好的JMX资料

    2. **MBean详解**:MBeans是JMX的核心,它们代表了管理系统中的资源。资料可能会详细解释如何定义、注册和使用不同类型的MBeans(标准、动态、模型)。 3. **JMX客户端工具**:如jconsole、jvisualvm等,这些都是...

Global site tag (gtag.js) - Google Analytics