一共4个类,ServerMonitorAgent提供了3种连接方式,直接上例子,可以看出来jmx基于rmi
/** * @author river.wang */ public interface ServerMonitorMBean { public long getUptime(); public String getMemory(); }
/** * ServerMonitor只能比接口少"MBean"这5个字母,不能写为ServerMonitorImpl * @author river.wang */ public class ServerMonitor implements ServerMonitorMBean{ private final long startTime; private Runtime runtime = Runtime.getRuntime(); public ServerMonitor() { startTime = System.currentTimeMillis(); } public long getUptime() { return System.currentTimeMillis()-startTime; } public String getMemory() { float freeMemory = (float)runtime.freeMemory(); float totalMemory = (float)runtime.totalMemory(); String memory = "idle scale : "+(freeMemory/totalMemory)+"%; freeMemory=" +(freeMemory)/1024+" KB; totalMemory="+(totalMemory)/1024+" KB" ; return memory; } }
/** * @author river.wang */ public class ServerMonitorAgent { public static void main( String[] args ) throws Exception { //在指定端口上启动远程对象注册服务程序,启用RMI,对应于 JAVA_HOME/bin/rmiregistry.exe LocateRegistry.createRegistry(9999); //MBeanServer MBeanServer server=MBeanServerFactory.createMBeanServer(); //被管理的bean ObjectName monitorName = new ObjectName( "river:type=ServerMonitorMBean,name=serverMonitor" ); server.registerMBean( new ServerMonitor(), monitorName ); //打开远程连接服务,可以用jconsole连接,或者自己写client连接 JMXServiceURL url=new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9999/serverMonitor"); JMXConnectorServer cs=JMXConnectorServerFactory.newJMXConnectorServer(url, null, server); cs.start(); //打开HtmlAdaptorServer服务,在浏览器输入http://localhost:8899进行连接,依赖jmxtools.jar,可以在附件中下载 HtmlAdaptorServer adapter = new HtmlAdaptorServer(8899); server.registerMBean(adapter, new ObjectName("river:name=htmlAdapter")); adapter.start(); } }
ServerMonitorMBean monitor = JMX.newMBeanProxy( ...,ServerMonitorMBean.class );
从jvm,classloader的角度看,client的ServerMonitorMBean和server端的不是一个类,最好在两台机器上或者jvm试试。
/** * @author river.wang */ public class ServerMonitorClient { public static void main( String[] args ) throws Exception { JMXConnector conn = JMXConnectorFactory.connect( new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://127.0.0.1:9999/serverMonitor" ), null ); ServerMonitorMBean monitor = JMX.newMBeanProxy( conn.getMBeanServerConnection(), new ObjectName( "river:type=ServerMonitorMBean,name=serverMonitor" ),ServerMonitorMBean.class ); for ( int i = 0; i < 10; i++ ) { System.out.println( monitor.getUptime() ); System.out.println( monitor.getMemory() ); } conn.close(); } }