JMX是一份规范,SUN依据这个规范在JDK提供了JMX接口。而根据这个接口的实现有很多种,比如Weblogic的JMX实现、MX4J、JBoss的JMX实现。在SUN自己也实现了一份,JDK5.0后就内嵌了进来,安装JDK5.0就可以开发基于JMX的代码了。
但JDK5.0并非包含所有SUN的关于JMX的代码,有一些工具类是排除在JDK5.0之外的。下面根据所使用的JDK1.6版本情况,谈一谈开发环境和示例。
环境准备
JDK1.6 + jmxtools.jar
示例
//要管理Hello则必须创建一个相应MBean,如下
说明:包含在MBean中方法都将是可以被管理的。MBean起名是有规范的,就是原类名后加上MBean字样
public interface HelloMBean {
public String getName();
public void setName(String name);
public void printHello();
public void printHello(String whoName);
}
//Hello是一个需要被管理的类(普通类)
public class Hello implements HelloMBean{
private String name;
public String getName() {
// TODO Auto-generated method stub
return this.name;
}
public void setName(String name) {
// TODO Auto-generated method stub
this.name = name;
}
public void printHello() {
// TODO Auto-generated method stub
System.out.println("Hello World, " + getName());
}
public void printHello(String whoName) {
// TODO Auto-generated method stub
System.out.println("Hello, " + whoName);
}
}
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 HelloAgent {
public static void main(String args[]) {
MBeanServer server = MBeanServerFactory.createMBeanServer();
try {
ObjectName helloName = new ObjectName("wgyang:name=HelloWorld");
server.registerMBean(new Hello(), helloName);
ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
HtmlAdaptorServer adaptor = new HtmlAdaptorServer();
server.registerMBean(adaptor, adapterName);
adaptor.start();
} catch (MalformedObjectNameException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NullPointerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstanceAlreadyExistsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MBeanRegistrationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
说明:
* 先创建了一个MBeanServer,用来做MBean的容器
* 将Hello这个类注入到MBeanServer中,注入需要创建一个ObjectName类
* 创建一个AdaptorServer,这个类将决定MBean的管理界面,这里用最普通的Html型界面。AdaptorServer其实也是一个MBean。
* chengang:name=HelloWorld的名字是有一定规则的,格式为:“域名:name=MBean名称”,域名和MBean名称都可以任意取。
运行
运行HelloAgent,然后打开网页:http://localhost:8082/,单击“name=HelloWorld”链接进入
总结
在实际系统中我们可以把name变成决定数库链接池的变量,这样我就可以对系统的运行参数进行实现的监控和配置(管理)。而且也可以对一些方法(如printHello)进行远程调用了