简介
JMX(Java Management Extensions,即Java管理拓展)。JMX可以让JDK自检测程序。常用于管理线程、内存、日志Level、服务重启、系统环境,让开发者可以获取程序运行的状态和动态修改的配置信息。
管理系统和资源的一个接口,定义管理系统与资源间交互标准。
JMX核心类
1 核心类库:
java.lang.management(VM监控)、javax.management(提供用户拓展)包
javax.management.MBeanServer实现Agent, javax.management.MBeans实现SubAgent。
2 JMX分层:
基础层:MBean(Managed Bean<=>被管理资源),含四种如下:
StandardMBean:需要继承接口,并且接口与实现类有一定的命名规则
DynamicMBean:动态不需要继承接口
ModelMBean:不常用
RequiredModelMBean:继承DynamicMBean,类似
适配层:MBeanServer
提供对资源的注册和管理
接入层:提供远程访问的入口
代码实现:
1 实现JDK小工具JConsole访问
//MBean接口
public interface HelloMBean {
public String getName();
public void setName(String name);
public String getAge();
public void setAge(String age);
public void helloWorld(String str);
}
//MBean实现类,实现类必须与接口名的保持一致:Hello<=>HelloMBean
public class Hello implements HelloMBean {
private String name;
private String age;
@Override
public String getName() {
System.out.println("get name: " + name);
return name;
}
@Override
public void setName(String name) {
System.out.println("set name: \"" + name + "\",old name: " + this.name);
this.name = name;
}
@Override
public String getAge() {
System.out.println("get age: " + age);
return age;
}
@Override
public void setAge(String age) {
System.out.println("set age:\"" + age + "\", old age: " + this.age);
this.age = age;
}
@Override
public void helloWorld(String str) {
System.out.println("hello world:\"" + str + "\",当前name: \"" + this.name + "\",age: " + age);
}
//!!注意.因为在MBean里没定义,
//!!jconsole的MBean操作里看不到getTelephone只能看到helloWorld()!!
public void getTelephone() {
System.out.println("get telephone");
}
}
//定义Agent层,在启动完之后去看Jconsole如下图所示:
public class HelloAgent {
public static void main(String[] args) throws Exception {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
//命名格式为xx:name=xxxx
ObjectName helloName = new ObjectName("jmxBean:name=hello");
//创建mbean和注册mbean
server.registerMBean(new Hello(), helloName);
Thread.sleep(60 * 60 * 1000);
}
}
2 实现JDK小工具浏览器访问
测试这个例子前需要导包如下:
//将对应的Agent改为如下,即可通过web界面进行像Jconsole一样访问
public static void main(String[] args) throws Exception {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName helloName = new ObjectName("jmxBean:name=hello"); //命名格式为xx:name=xxxx
//创建mbean和注册mbean
server.registerMBean(new Hello(), helloName);
ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8085");
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
server.registerMBean(adapter, adapterName);
adapter.start(); //然后访问http://localhost:8085
}
JMX在Tomcat中实现 todo:
更多待后续更新~~~~~~~~~~~~~~~~~~~~~~~