目录
目录
JMX是什么
JMX(Java Management Extensions)是一个为应用程序植入管理功能的标准化代理和服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等。JConsole以及JVisualVM 都是通过JMX来实现对JAVA应用程序的监控。
JMX架构
MBean是JMX中被管理的资源。MBean全部都是由MBeanServer统一管理,并通过MBeanServer对外提供的访问接口提供服务。

MBean
JMX定义了四种类型的MBean,标准MBean,动态MBean,开放MBean和模型MBean
- 标准MBean是最简单的实现,他们的管理接口是通过方法名描述的。MXBean是是一种标准的MBean,它使用开放的MBean概念,在简化代码的同事,达到易于管理的目的。
- 动态MBean必须实现特定的接口,但是他们在运行时对外提供管理接口,所以具有很大的灵活性。
- 开放MBean是动态MBean
- 模型MBean也是动态MBean,它是运行时完全可配置和自我描述的。它们为动态设备层资源提供具有默认行为的一般MBean类。
任何一个作为MBean的java实现的java对象,被注册到代理上后,都可以从代理机构的JVM外管理。因此,应用程序中使用JMX只需要两步:
- 编写MBean提供管理接口和监控数据
- 将MBean注册到MBeanServer
下面本别就四种MBean去看看如何使用
标准MBean
标准MBean是最简单的MBean类型,主要步骤如下:
定义接口
/**
*定义一个普通的接口
*
* @author zhangwei_david
* @version $Id: HiMBean.java, v 0.1 2015年1月24日 下午1:16:15 zhangwei_david Exp $
*/
public interface HiMBean {
/**
*打招呼
*/
public void sayHello();
/**
* 加法计算器
*
* @param x
* @param y
* @return
*/
public int add(int x, int y);
/**
* 获取名称
*
* @return
*/
public String getName();
/**
*获取缓存大小
*
* @return
*/
public int getCacheSize();
/**
*设置缓存大小
*
* @param size
*/
public void setCacheSize(int size);
}
实现接口
/**
*简单实现类
* @author Lenovo
* @version $Id: Hi.java, v 0.1 2014年9月26日 下午2:48:09 Lenovo Exp $
*/
public class HiMbeanImpl implements HiMBean {
private final String name = "Reginald";
private int cacheSize = DEFAULT_CACHE_SIZE;
private static final int DEFAULT_CACHE_SIZE = 200;
/**
* @see com.cathy.demo.jmx.notifications.HiMBean#sayHello()
*/
public void sayHello() {
System.out.println("Hello," + getName());
}
/**
* @see com.cathy.demo.jmx.notifications.HiMBean#add(int, int)
*/
public int add(int x, int y) {
return x + y;
}
/**
* @see com.cathy.demo.jmx.notifications.HiMBean#getName()
*/
public String getName() {
return name;
}
/**
* @see com.cathy.demo.jmx.notifications.HiMBean#getCacheSize()
*/
public int getCacheSize() {
return cacheSize;
}
/**
* @see com.cathy.demo.jmx.notifications.HiMBean#setCacheSize(int)
*/
public void setCacheSize(int size) {
cacheSize = size;
}
}
注册MBean
/**
*
*
* @author zhangwei_david
* @version $Id: Main.java, v 0.1 2015年6月19日 下午1:10:03 zhangwei_david Exp $
*/
public class Main {
/**
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//获取Mean的平台服务
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
// 对即将被注册的MBean 构造一个ObjectName
ObjectName objectName = new ObjectName("com.cathy.demo.jmx:type=Hi");
// 创建一个Mbean
RequiredModelMBean mbean = new RequiredModelMBean();
HiMbeanImpl hiMbean = new HiMbeanImpl();
mbean.setManagedResource(hiMbean, "objectReference");
ModelMBeanAttributeInfo name = new ModelMBeanAttributeInfo("name", "java.lang.String",
"userName", true, true, false, new DescriptorSupport(new String[] { "name=name",
"descriptorType=attribute", "getMethod=getName", "setMethod=setName" }));
ModelMBeanOperationInfo sayHello = new ModelMBeanOperationInfo("say Hello", hiMbean
.getClass().getMethod("sayHello"));
// 创建一个ModelMBeanOperationInfo
ModelMBeanOperationInfo getName = new ModelMBeanOperationInfo("get userName", hiMbean
.getClass().getMethod("getName"));
// 使用ModelMbeanAttributeInfo和ModelMbeanOperationInfo构建一个ModelMBeanInfo对象
ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport("HiMbean", "Test",
new ModelMBeanAttributeInfo[] { name }, null, new ModelMBeanOperationInfo[] { sayHello,
getName }, null);
// 向ModelMBean 设置ModelMBeanInfo
mbean.setModelMBeanInfo(mbeanInfo);
// 将Mbean 注册到MBeanServer
mbs.registerMBean(mbean, objectName);
// 一直等待
System.out.println("Waiting forever...");
Thread.sleep(Long.MAX_VALUE);
}
}
使用MBean
运行后的可以通过jconsole看到MBean
此时可以发现无法通过Web去管理MBean,那么如何通过Web去管理呢?
如何通过Web管理MBean
要想通过Web去管理MBean需要创建一个HtmlAdapterServer,并将其注册到MBeanServer