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操作时动态生成的。
分享到:
相关推荐
NULL 博文链接:https://jasonhan-sh-hotmail-com.iteye.com/blog/1171904
### Java分布式应用学习笔记09JMX-MBean的介绍 #### MBean概念及作用 MBean,即Managed Bean,是在JMX(Java Management Extensions)框架中用于管理资源的一种特殊Java对象。通过MBean,可以方便地对应用程序进行...
通过阅读和理解这个示例,你可以更深入地了解如何在实际项目中应用JMX RMI MBean管理。这个实例可能包括创建MBean的Java类、配置RMI的脚本或属性文件,以及演示如何从客户端进行连接和操作的测试代码。 总的来说,...
1. **MBean接口和实现**:MBean是JMX的核心,它定义了管理接口。一个MBean可以是简单的POJO(Plain Old Java Object),提供了暴露给管理系统的方法。MBean接口通常定义了管理操作和属性,而MBean的实现则提供了具体...
JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理和监控应用程序。JMX框架主要由三部分组成:MBean(Managed Bean)、Agent(代理)和Client(客户端)。在本场景中,我们将...
6. **JMX Hello World示例**:通常,这个示例会包含一个简单的MBean,该MBean有一个或多个操作(方法),可能还有属性。用户可以通过JConsole或其他可视化工具来访问和操作这个MBean,例如,显示一条“Hello World”...
在"jmx_examples"压缩包中,可能包含了以上各个方面的代码示例,通过这些示例,读者可以更直观地理解和应用JMX技术。学习和实践这些例子,能够帮助开发者更好地利用JMX来管理和监控复杂的Java系统。
本示例是一个简单的JMX实现,适合初学者理解JMX的基本概念和工作原理。 首先,我们来了解JMX的核心组件: 1. **MBean**(Managed Beans):MBean是JMX中的管理对象,代表了可管理的资源。它可以是任何Java对象,...
下面是一个简单的JMX示例,展示如何创建一个MBean,注册到MBean Server,并通过JConsole进行管理: ```java import javax.management.*; public class MyManagedBean implements DynamicMBean { private final ...
JMX允许开发者创建管理接口,以便对运行时的组件进行动态监控和管理。在这个"jmx_examples.rar"压缩包中,包含了多个JMX的简单示例,这将帮助我们了解如何在Java 8中使用JMX。 1. **JMX基础知识**: - JMX的核心...
6. **客户端示例**:项目可能还包含一个简单的客户端示例,展示了如何使用JMX API连接到MBean服务器,查询MBean信息,调用其操作,以及监控和改变MBean的属性。 通过分析`jmxdemo`项目的源代码,你可以学习如何创建...
JMX兼容的代理提供了一组标准MBean,这些MBean构成了JMX的监控服务。由于这些监控器是以MBean的形式实现的,用户可以在运行时根据需要实例化和修改它们。监控MBean的目标是其他MBean的属性,它们会监视预定义的事件...
通过上述示例可以看出,JMX通过定义MBean接口和其实现类的方式,使得我们能够通过标准的方法来管理和监控应用程序。这种方式不仅提高了应用程序的可管理性,同时也降低了管理操作的复杂度。 #### 六、总结 JMX作为...
#### Timer MBean示例 下面是一个使用Timer MBean的示例: 1. **在mlet配置文件中添加Timer MBean**: ```xml <MLET CODE="javax.management.timer.Timer" NAME="DefaultDomain:service=Timer" ARCHIVE="jmxri....
通过分析和运行这个示例,开发者可以更深入地理解JMX与OSGi的集成,并将其应用于自己的项目中,以实现更灵活、可扩展的系统管理。 总之,JMX和OSGi的结合为Java应用程序提供了强大的管理和模块化能力。通过这个实例...
- 通过具体的示例演示了如何通过 JMX Agent 远程管理 MBean 服务器。 - 包括如何查询 MBean 属性、调用操作方法等。 #### 十、高级 MBean 加载技术 - **MBean 加载机制**: - 深入探讨了 MBean 的加载过程以及...
《JMX技术介绍》一书显然是为了深入探讨这一技术而编写的,配套源代码则提供了实践示例,帮助读者更好地理解和应用JMX。 1. JMX架构: JMX架构由管理代理(MBeans)、服务提供者接口(MBean Server)和管理客户端...
jmxdemo.rar是一个包含JMX服务端和客户端的示例,帮助我们理解如何利用JMX进行远程监控Java项目,而VisualVM是一个强大的Java诊断工具,它可以利用JMX进行远程连接和监控。 首先,我们需要了解JMX的基本概念。JMX的...
Java自带的JConsole是JMX的一个示例客户端,它可以连接到本地或远程的JVM,并可视化地展示MBean的信息,进行监控和管理。 7. **JMX的应用场景**: JMX常用于服务器监控,如内存使用、线程状态、JDBC连接池等。在...
4. **Management Agents**: JMX 还包括Management Agents,它们负责暴露MBean Server,使远程客户端能够访问和管理MBean。例如,使用JMX Remote API,可以跨网络远程管理Java应用程序。 5. **Web-Based UI**: JMX ...