zoukankan      html  css  js  c++  java
  • 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();
        }
    
    }

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

  • 相关阅读:
    python
    python 随机数生成
    PowerShell学习笔记二_变量、Select、Foreach、where
    PowerShell学习笔记一_cmdlet、管道、如何入门
    vscode 配置
    mvn 命令
    Microsoft 365:如何在Word文件中插入另一个不同文档内容或者链接
    Microsoft 365:如何使用Tag来管理在Teams中提到的组
    Microsoft 365:Microsoft Teams 实时字幕助力您打破语言沟通障碍
    2020年SharePoint Saturday _ China, 精彩回顾
  • 原文地址:https://www.cnblogs.com/liqiu/p/3793373.html
Copyright © 2011-2022 走看看