JMX入门开发

什么是JMX?或者是JMX是做什么的?我的理解是:可以远程管理/编辑JAVA对象。如图:

上面的SchemaName属性就是可以动态修改的,那么是如何做到的哪?下面咱们逐步分析。

一、首先假设咱们有个对象SystemConfig,包含两个属性threadCount和schemaName

package study;

public class SystemConfig implements SystemConfigMBean {
    private int threadCount;
    private String schemaName;

    public SystemConfig(int numThreads, String schema) {
        this.threadCount = numThreads;
        this.schemaName = schema;
    }

    @Override
    public void setThreadCount(int noOfThreads) {
        this.threadCount = noOfThreads;
    }

    @Override
    public int getThreadCount() {
        return this.threadCount;
    }

    @Override
    public void setSchemaName(String schemaName) {
        this.schemaName = schemaName;
    }

    @Override
    public String getSchemaName() {
        return this.schemaName;
    }

    @Override
    public String doConfig() {
        return "No of Threads=" + this.threadCount + " and DB Schema Name=" + this.schemaName;
    }
}
package study;

public interface SystemConfigMBean {
    public void setThreadCount(int noOfThreads);

    public int getThreadCount();

    public void setSchemaName(String schemaName);

    public String getSchemaName();

    // any method starting with get and set are considered
    // as attributes getter and setter methods, so I am
    // using do* for operation.
    public String doConfig();
}

二、需要实现远程动态修改这个对象,那么就需要将这个类注册到JMX里面,代码如下:

package study;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;
import javax.management.ObjectName;

public class SystemConfigManagement {
    private static final int DEFAULT_NO_THREADS = 10;
    private static final String DEFAULT_SCHEMA = "default";

    public static void main(String[] args) throws Exception {

        // Get the MBean server
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        // register the MBean
        SystemConfig mBean = new SystemConfig(DEFAULT_NO_THREADS, DEFAULT_SCHEMA);
        ObjectName name = new ObjectName("xman:type=SystemConfig");
        mbs.registerMBean(mBean, name);
        do {
            Thread.sleep(3000);
            System.out.println("Thread Count=" + mBean.getThreadCount() + ":::Schema Name=" + mBean.getSchemaName());
        } while (mBean.getThreadCount() != 0);
    }

}

三、想要支持远程管理,就需要配置JMX参数,如图:

四、在本地运行jconsole链接上来,然后修改Count的值:

五、最后再看结果:

实现了上面的内容,那么自然就会想能否程序自动调用修改,而不用jconsole,下面就可以了:

package study;

import javax.management.JMX;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class Client {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
    JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:8888/jmxrmi");
    JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
    
    MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
    
    ObjectName mbeanName = new ObjectName("xman:type=SystemConfig");
    
    SystemConfigMBean mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName, SystemConfigMBean.class, true);
    int threadCount = mbeanProxy.getThreadCount();
    System.out.println("Current ThreadCount: " + threadCount);
    mbeanProxy.setThreadCount(100);
    threadCount = mbeanProxy.getThreadCount();
    System.out.println("Changed ThreadCount: " + threadCount);
    
    Thread.sleep(3);
    jmxc.close();
    }

}

上面的程序不需要我怎么解释了吧,远程连接,修改内容。

原文地址:https://www.cnblogs.com/liqiu/p/3793373.html