[color=red]"JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理"[/color]
举一个应用实例:在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来写这些代码呢?
1. 程序初哥一般是写死在程序里,到要改变时就去改程序,然后再编译发布;
2. 程序熟手则一般把这些信息写在一个配置文件里(JAVA一般都是*.properties文件),到要改变时只要改配置文件,但还是重新启动系统,以便读取配置文件里的新值;
3. 程序好手则会写一个段代码,把配置值缓存起来,系统在读值的时候,先看看配置文件有没有更动。如有更改则重读一遍,否则从缓存里读取值
4. 程序高手则懂得取物为我所用,用JMX!把配置属性集中在一个类,然后写一个叫MBean的东东,再配置一下就轻松搞定了。而且JMX自动提供了一个WEB页面来给你来改变这些配置信息。
JMX中MBean有DynamicMBean和StandardMBean两类,前者动态组装一个监控对象,较为复杂,但更为灵活,不需要监控类继承*MBean接口,后者简单。
架构图如下:
[img]http://upload.wikimedia.org/wikipedia/en/thumb/d/db/Jmxarchitecture.png/600px-Jmxarchitecture.png[/img]
1.建立一个需要被JMX管理的类Hello
Java代码
2.建立Hello类的MBean接口,接口名必须是要管理的类名+MBean
Java代码 复制代码
3.创建一个Agent类(通过html-adapter方式)
Java代码 复制代码
说明:
HtmlAdaptorServer在jmxtools.jar包中,需要到SUN网站下载JMX 1.2.1 Reference Implementation
MBeanServer是一个包含所有注册MBean的仓库.它是JMX代理层的核心.JMX1.0规范提供一个接口叫 javax.management.MBeanServer. 所有管理的在MBean操作通过MBeanServer执行.使用MBeanServer实例,你能够管理所有MBean.每一个MBean具有一个唯一标志,叫ObjectName.
ObjectName (javax.management.ObjectName)是一个类,唯一标志一个在MBeanServer的MBean.这个对象名称用于管理应用程序来标志MBean以便操作能够在适当的MBean上被调用.一个对象名称包含两部分:域名称和没有经过排序的一个或者多个关键属性集,语法:[domain name]:property=value[,property=value]
AdaptorServer,这个类将决定MBean的管理界面,这里用最普通的Html型界面。AdaptorServer其实也是一个MBean
运行HelloAgent,打开IE输入http://localhost:8091就可以看到注册的MBean,在控制台看printHello的输出结果
3.创建一个Agent类(通过rmi-connector方式)
测试类
举一个应用实例:在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来写这些代码呢?
1. 程序初哥一般是写死在程序里,到要改变时就去改程序,然后再编译发布;
2. 程序熟手则一般把这些信息写在一个配置文件里(JAVA一般都是*.properties文件),到要改变时只要改配置文件,但还是重新启动系统,以便读取配置文件里的新值;
3. 程序好手则会写一个段代码,把配置值缓存起来,系统在读值的时候,先看看配置文件有没有更动。如有更改则重读一遍,否则从缓存里读取值
4. 程序高手则懂得取物为我所用,用JMX!把配置属性集中在一个类,然后写一个叫MBean的东东,再配置一下就轻松搞定了。而且JMX自动提供了一个WEB页面来给你来改变这些配置信息。
JMX中MBean有DynamicMBean和StandardMBean两类,前者动态组装一个监控对象,较为复杂,但更为灵活,不需要监控类继承*MBean接口,后者简单。
架构图如下:
[img]http://upload.wikimedia.org/wikipedia/en/thumb/d/db/Jmxarchitecture.png/600px-Jmxarchitecture.png[/img]
1.建立一个需要被JMX管理的类Hello
Java代码
package bcndly.test.jmx;
public class Hello implements HelloMBean {
private String name;
public String getName() {
return name;
}
public void printHello() {
System.out.println("Hello, " + name);
}
public void printHello(String theName) {
System.out.println("Hello, " + theName);
}
public void setName(String name) {
this.name = name;
}
}
2.建立Hello类的MBean接口,接口名必须是要管理的类名+MBean
Java代码 复制代码
package bcndly.test.jmx;
public interface HelloMBean {
public String getName();
public void setName(String name);
public void printHello();
public void printHello(String theName);
}
3.创建一个Agent类(通过html-adapter方式)
Java代码 复制代码
package bcndly.test.jmx;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import com.sun.jdmk.comm.HtmlAdaptorServer;
public class HelloAgent {
public static void main(String[] args) throws Exception {
MBeanServer server = MBeanServerFactory.createMBeanServer();
ObjectName helloName = new ObjectName("bcndyl:name=HelloWorld");
server.registerMBean(new Hello(), helloName);
ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8091");
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
adapter.setPort(8091);
server.registerMBean(adapter, adapterName);
adapter.start();
System.out.println("start.....");
}
}
说明:
HtmlAdaptorServer在jmxtools.jar包中,需要到SUN网站下载JMX 1.2.1 Reference Implementation
MBeanServer是一个包含所有注册MBean的仓库.它是JMX代理层的核心.JMX1.0规范提供一个接口叫 javax.management.MBeanServer. 所有管理的在MBean操作通过MBeanServer执行.使用MBeanServer实例,你能够管理所有MBean.每一个MBean具有一个唯一标志,叫ObjectName.
ObjectName (javax.management.ObjectName)是一个类,唯一标志一个在MBeanServer的MBean.这个对象名称用于管理应用程序来标志MBean以便操作能够在适当的MBean上被调用.一个对象名称包含两部分:域名称和没有经过排序的一个或者多个关键属性集,语法:[domain name]:property=value[,property=value]
AdaptorServer,这个类将决定MBean的管理界面,这里用最普通的Html型界面。AdaptorServer其实也是一个MBean
运行HelloAgent,打开IE输入http://localhost:8091就可以看到注册的MBean,在控制台看printHello的输出结果
3.创建一个Agent类(通过rmi-connector方式)
public class HelloAgent {
public static void main(String[] args) throws Exception {
MBeanServer mbs = MBeanServerFactory.createMBeanServer("RMIAgent");
RmiConnectorServer connector = new RmiConnectorServer();
ObjectName connectorName = null;
try {
connectorName = new ObjectName("RMIAgent:name=RMIConnector");
mbs.registerMBean(connector, connectorName);
Hello hello = new Hello();
ObjectName testMBeanName = new ObjectName("RMIAgent:name=Hello");
mbs.registerMBean(hello, testMBeanName);
connector.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
测试类
public class RMIManager {
public static void main(String[] args) {
RmiConnectorClient client = new RmiConnectorClient();
RmiConnectorAddress address = new RmiConnectorAddress();
[color=orange]try {
client.connect(address);
ObjectName testMBeanName = ObjectName.getInstance("RMIAgent:name=testMBean");
client.invoke(testMBeanName, "fun", null, null);
client.setAttribute(testMBeanName, new Attribute("Field", new String(
"hello JMX from manager!")));
System.out.println(client.invoke(testMBeanName, "fun", null, null));
} catch (Exception e) {
e.printStackTrace();
} finally {
}[/color]
}
}