一、简介
Model MBean是基于DynamicMBean的更实用的MBean,如果编写被管理的类为标准MBean,我们必须为它们实现一套以MBean为后缀名的接口,这样使代码的耦合度增高。而基于Model Mbean,我们可以用配置文件等动态的方式来管理类,被管理的类可以是普通的类,这样也降低了系统的耦合性。
二、准备工作
1、为了Web方式管理MBean,我们引入jmxtools.jar
三、代码实例
package com.muyu.jmx;
public class ConfigModel {
private String configLocation;
public String getConfigLocation() {
return configLocation;
}
public void printConfigLocation() {
System.out.println(configLocation);
}
public void printConfigLocation(String i_ConfigLocation) {
System.out.println(i_ConfigLocation);
}
public void setConfigLocation(String configLocation) {
this.configLocation = configLocation;
}
}
package com.muyu.jmx;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
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 ConfigAgent {
public static void main(String[] args) throws Exception {
MBeanServer server = MBeanServerFactory.createMBeanServer();
ObjectName configName = new ObjectName("LuisFigo:name=configModel");
RequiredModelMBean config = ModelMBean.createModelMBean();
server.registerMBean(config, configName);
ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8000");
//通过Web来管理MBean
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
adapter.setPort(8000);
server.registerMBean(adapter, adapterName);
adapter.start();
System.out.println("adapter start.....");
//通过RMI方式来管理MBean
Registry registry = 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.....");
}
}
package com.muyu.jmx;
import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.Descriptor;
import javax.management.InstanceNotFoundException;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanException;
import javax.management.MBeanParameterInfo;
import javax.management.ReflectionException;
import javax.management.RuntimeOperationsException;
import javax.management.modelmbean.DescriptorSupport;
import javax.management.modelmbean.InvalidTargetObjectTypeException;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;
import javax.management.modelmbean.ModelMBeanOperationInfo;
import javax.management.modelmbean.RequiredModelMBean;
public class ModelMBean {
private static final boolean READABLE = true;
private static final boolean WRITABLE = true;
private static final boolean IS = true;
private final static String STRING_CLASS = "java.lang.String";
public static RequiredModelMBean createModelMBean() throws RuntimeOperationsException,
MBeanException, InstanceNotFoundException, InvalidTargetObjectTypeException, AttributeNotFoundException, InvalidAttributeValueException, ReflectionException {
RequiredModelMBean modelMBean = null;
modelMBean = new RequiredModelMBean();
modelMBean.setManagedResource(new ConfigModel(), "ObjectReference");
ModelMBeanInfo info = createModelMBeanInfo();
modelMBean.setModelMBeanInfo(info);
modelMBean.setAttribute(new Attribute("ConfigLocation", "test initial"));
return modelMBean;
}
public static ModelMBeanInfo createModelMBeanInfo() {
Descriptor portAttrDesc = new DescriptorSupport();
portAttrDesc.setField("name", "ConfigLocation");
portAttrDesc.setField("descriptorType", "attribute");
portAttrDesc.setField("displayName", "ConfigLocation");
portAttrDesc.setField("getMethod", "getConfigLocation");
portAttrDesc.setField("setMethod", "setConfigLocation");
//属性
ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo("ConfigLocation", // 属性名
STRING_CLASS, //属性类型
"luisfigo location", // 描述文字
READABLE, WRITABLE, !IS, // 读写
portAttrDesc
);
//方法
Descriptor getStateDesc = new DescriptorSupport(new String[] {
"name=getConfigLocation", "descriptorType=operation", "class=com.muyu.jmx.ConfigModel",
"role=operation" });
// 构造 setConfigLocation操作描述符信息
Descriptor setStateDesc = new DescriptorSupport(new String[] {
"name=setConfigLocation", "descriptorType=operation", "class=com.muyu.jmx.ConfigModel",
"role=operation" });
ModelMBeanOperationInfo getConfigLocation = new ModelMBeanOperationInfo(
"getConfigLocation",
"get configLocation attribute",
null,
"java.lang.String",
ModelMBeanOperationInfo.ACTION,
getStateDesc
);
MBeanParameterInfo[] setStateParms = new MBeanParameterInfo[] { (new MBeanParameterInfo(
"configLocation_para", "java.lang.String", "new configLocation value")) };
ModelMBeanOperationInfo setConfigLocation = new ModelMBeanOperationInfo(
"setConfigLocation",
"set configLocation attribute",
setStateParms,
"void",
ModelMBeanOperationInfo.ACTION,
setStateDesc
);
ModelMBeanOperationInfo printConfig = new ModelMBeanOperationInfo("printConfigLocation", "控制台输出configLocation信息",
null, "void", ModelMBeanOperationInfo.INFO, null);
ModelMBeanOperationInfo printConfig_1 = null;
MBeanParameterInfo[] params = new MBeanParameterInfo[1];
params[0] = new MBeanParameterInfo("i_ConfigLocation", STRING_CLASS, "Hello , I am LuisFigo");
printConfig_1 = new ModelMBeanOperationInfo("printConfigLocation", "控制台输出configLocation_para信息",
params, "void", ModelMBeanOperationInfo.INFO, null);
ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
RequiredModelMBean.class.getName(), // MBean类
"ModelMBeanInfoSupport Dynamic MBean", // 描述文字
new ModelMBeanAttributeInfo[] { // 所有的属性信息(数组)
nameAttrInfo },//只有一个属性
null, // 所有的构造函数信息
new ModelMBeanOperationInfo[] { // 所有的操作信息(数组)
getConfigLocation,
setConfigLocation,
printConfig,
printConfig_1},//
null,
null
);
return mbeanInfo;
}
}
package com.muyu.jmx;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class ConfigClient {
public static void main(String[] args) throws IOException, MalformedObjectNameException, NullPointerException, InstanceNotFoundException, MBeanException, ReflectionException, AttributeNotFoundException, InvalidAttributeValueException {
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9999/mserver");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
Set names = mbsc.queryNames(null, null);
for (Iterator i = names.iterator(); i.hasNext();) {
System.out.println("\tObjectName = " + (ObjectName) i.next());
}
ObjectName stdMBeanName = new ObjectName("LuisFigo:name=configModel");
mbsc.invoke(stdMBeanName, "printConfigLocation", new String[]{"helloworld"}, new String[]{"java.lang.String"});
mbsc.setAttribute(stdMBeanName, new Attribute("ConfigLocation", "LuisFigo, this is a new configLocation"));
mbsc.invoke(stdMBeanName, "printConfigLocation", null, null);
jmxc.close();
}
}
说明:
运行ConfigAgent后,在浏览器里输入地址http://localhost:8000/,点击name=configModel后进行configModel MBean管理页面,可以对configMBean进行一些操作,同第二节介绍的标准MBean很相似。运行ConfigClient可以发现,通过RMI可以管理ConfigAgent中注册的MBean。
四、总结
动态ModelMBean实现了被管理类与JMX的解耦,在ModelMBean类里我们可以暴露一些操作和属性。而客户端看起来像什么事都没有发生一样。如果采用JMX来管理系统的话,我们只需要提供一个ModelMBean这样一个管理类就可以,而不需要破坏原来的系统代码,真正实现了系统与JMX的解耦。
分享到:
相关推荐
NULL 博文链接:https://jasonhan-sh-hotmail-com.iteye.com/blog/1171904
在本实例中,我们重点关注的是如何使用Remote Method Invocation(RMI)来实现JMX的MBean管理。RMI是一种在Java平台上进行远程调用的技术,使得一个Java对象的方法可以在不同的Java虚拟机(JVM)之间被调用。结合JMX...
### Java分布式应用学习笔记09JMX-MBean的介绍 #### MBean概念及作用 MBean,即Managed Bean,是在JMX(Java Management Extensions)框架中用于管理资源的一种特殊Java对象。通过MBean,可以方便地对应用程序进行...
**JMX(一)——MBean Server** Java Management Extensions (JMX) 是Java平台上的一个标准,用于管理和监控应用程序、设备和服务。它提供了一个灵活的框架,使得开发者能够轻松地创建可管理的组件,并通过标准接口...
MBeans有三种类型:标准MBean、模型MBean和动态MBean。标准MBean通过特定的接口定义其管理属性和操作;模型MBean根据运行时的元数据自动生成接口;动态MBean则允许在运行时动态定义MBean的行为。 3. **MBean服务器*...
5. **使用JConsole或VisualVM**:这两个内置的JMX客户端工具的使用方法,包括连接到远程MBean Server、查看和修改MBean属性、接收和处理通知。 6. **编写自定义管理工具**:介绍如何使用JMX API创建自己的管理工具...
黑心的人都5分下载分,csdn也不让选择免费了,不想下载的直接看一下解释: http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/download.jsp JMX 1.2.1 Reference Implementation(重点) ...
- 动态MBean:不依赖于特定类,其接口动态定义。 - Open MBean:提供通用数据类型,便于跨平台交换管理信息。 2. MBean操作: - 注册:将MBean添加到MBean服务器中。 - 查询:根据指定的条件查找MBeans。 - ...
- **MBean(Managed Beans)**: MBean是JMX中最基本的管理单元,它是Java对象,代表可管理的资源或服务。MBean可以是标准MBean、开放MBean或模型MBean,每种类型都有不同的接口和注册方式。 - **MBean Server**: 这...
3. **模型MBean**:模型MBean通过元数据描述其属性、操作和通知,这样可以更灵活地处理各种类型的MBean,而无需为每个MBean创建单独的接口。 4. **开放MBean**:开放MBean提供了一种标准的数据类型和转换机制,使得...
接着,书中的章节详细讲述了如何创建自定义MBean,包括标准MBean、开放MBean和模型MBean的不同类型,以及它们的注册和管理过程。此外,书中还讨论了MBean服务器的选择和配置,如内置MBean服务器和远程MBean服务器的...
5. **适配器与代理**:JMXri提供了多种适配器,使得非JMX应用程序也能与JMX环境交互。此外,还可以通过代理服务在不同的JMX域之间进行通信。 总的来说,`jmxri-1.2.1`是JMX框架中不可或缺的一部分,尤其是在需要...
有标准MBean、开放MBean、模型MBean和动态MBean四种类型,它们各有不同的创建和使用方式。 2. **MBeanServer**:MBeanServer是JMX架构的核心组件,负责注册、管理MBean以及处理MBean之间的交互。开发者可以通过...
5. **JMX连接器**:`jmxdemo`可能包含了JMX连接器的配置,如RMI连接器,允许远程客户端连接到MBean服务器进行管理操作。 6. **客户端示例**:项目可能还包含一个简单的客户端示例,展示了如何使用JMX API连接到...
MBean分为标准MBean、动态MBean、开放MBean和模型MBean等不同类型,它们分别适用于不同的监控和管理场景。 JMX技术的另一个重要概念是通知。通知是JMX框架用来实现异步通信的一种机制。当MBean的某个属性发生变化,...
4. **Model MBean**:是Dynamic MBean的一种增强,它提供了一种模型化的方式,允许将任何Java对象封装为MBean,而无需直接实现`DynamicMBean`接口。Model MBean通过实现`javax.management.modelmbean.ModelMBeanInfo...
有标准MBean、模型MBean和动态MBean三种类型。 3. **MBean Server**:MBean Server是JMX框架的中心,负责注册MBean、执行MBean的操作以及处理MBean之间的交互。 4. **JMX连接器**:JMX连接器允许远程客户端连接到...
MBean是JMX的核心元素,分为标准MBean和动态MBean。标准MBean适用于定义明确、稳定的资源,它们基于Java Bean模式,通过内省机制获取属性和方法信息。动态MBean则提供了更大的灵活性,包括Open MBean和Model MBean,...
2. **动态MBean**:不依赖于固定的接口,而是通过运行时的MBeanInfo接口动态地描述其属性和操作。 3. **开放MBean**:使用特定的元数据类(如MBeanInfo和MBeanAttributeInfo)来提供更精确的类型信息,便于跨Java...
JMX应用实例与实现,通过一个简单的JavaWeb应用来验证JMX在应用中的植入管理和应用