开发环境:Eclipse Standard/SDK,JDK版本:6.0
基于JMX开发需要五个包:jmxri.jar,jmxremote.jar,jmissl.jar,jmxtools.jar,jmxremote_optional.jar,其中jmxri.jar,jmxremote.jar,jmissl.jar是必须的,jmxtools.jar,jmxremote_optional.jar如果用到就需要加入。在jkd5.0以后jmxri.jar,jmxremote.jar,jmissl.jar已经内嵌进jdk中,不需要额外加入。
开发最简单的JMX例子需要3步:
1、建立需要管理接口(比如:GlobleConfigsMBean)
2、建立需要管理的对象(比如:GlobleConfigs)并实习GlobleConfigsMBean接口
3、建立Agent类,进行管理对象的注册和适配器的监听
新建java project,然后将下载jmxtools-1.2.jar并加入classpath
下面是具体代码:
1、管理接口
package wangchao.config;
public interfaceGlobleConfigsMBean {
public String getIpDir();
public void setIpDir(String ipDir);
}
2、需要管理的对象
package wangchao.config;
public class GlobleConfigs implements GlobleConfigsMBean{
private String ipDir;
public String getIpDir(){
returnipDir;
}
public voidsetIpDir(String ipDir) {
this.ipDir= ipDir;
}
}
3、Agent类
packagewangchao.config;
importjava.lang.management.ManagementFactory;
importjavax.management.MBeanServer;
importjavax.management.ObjectName;
importcom.sun.jdmk.comm.HtmlAdaptorServer;
public classGlobleConfigsAgent {
public static void main(String[] args)throws Exception {
//管理对象注册,和适配器监听
MBeanServer mbServer =ManagementFactory.getPlatformMBeanServer();
ObjectName objName = new ObjectName("setting:name=ip1"); //这里【setting】和【ip1】名字随便取
GlobleConfigs conf = newGlobleConfigs();
conf.setIpDir("192.168.196.17");
mbServer.registerMBean(conf,objName);
ObjectName adapterName = newObjectName("GlobleConfigsAgent:name=htmladapter,port=8081");
HtmlAdaptorServer adapter =new HtmlAdaptorServer();
mbServer.registerMBean(adapter,adapterName);
adapter.start();
System.out.println("start.....");
//验证修改的值是否实时改变
for (int i = 0; i < 100;i++) {
Thread.sleep(2000);
System.out.println(conf.getIpDir());
}
}
}
OK,代码写完。运行GlobleConfigsAgent,然后访问:localhost:8082,如图:
点击name=ip1,对ip1的值进行重新设置,注意控制台输出。
注意1:
你可能发现:GlobleConfigsAgent中设置ObjectName adapterName = newObjectName("GlobleConfigsAgent:name=htmladapter,port=8081")中有个port=8081,为什么访问的的是8082呢?其实这里的port=8081没什么意义,只是GlobleConfigsAgent这个键的值而已,页面展示用的。真正的访问端口在HtmlAdaptorServer adapter = newHtmlAdaptorServer(8083)配置,如果不配置默认是8082。
注意2:
管理接口命名必须是:需管理对象类名+MBean,否则报如下错误
javax.management.NotCompliantMBeanException:MBean class wangchao.config.GlobleConfigs does not implement DynamicMBean,neither follows the Standard MBean conventions
比如:这里的管理接口是GlobleConfigsMBean,GlobleConfigs+MBean,改成IGlobleConfigsMBean会报错
注意3:
网上也有很多关于JMX入门的文章和笔记,但是也有一些有问题,比如有人说“com.sun.jdmk.trace.Trace找不到,将jxmri.jar加入到classpath即可”,这就有问题,因为Trace在jmxtools.jar里面。在运行过程中:如果报java.lang.NoClassDefFoundError:com/sun/jdmk/trace/Trace错误;检查是否导入jmxtools.jar包,其次检查jmxtools.jar的版本对不对,应该是jmxtools-1.2.jar或以后版本,笔者就是因为导入版本不对导致耽误了一定时间。