jmx实例

一共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();
    }
}

猜你喜欢

转载自luckywnj.iteye.com/blog/1715427
JMX
今日推荐