jmx中标准MBean使用

jmx中标准MBean使用

一、简介

jmx(java management extentions),即java管理扩展,用于对应用程序进行监控和管理。jmx是一个标准、接口或者框架,可以在应用程序运行期,对自定义类发起调用。这里对标准MBean进行介绍。

二、标准Mbean开发步骤

标准Mbean开发步骤如下:

  1. 自定义以MBean结尾的接口,如:StaticConfigManagerMBean;

  2. 实现步骤1定义的接口,特别注意接口实现类名必须是接口去掉结尾MBean,如:StaticConfigManager;

  3. 对MBean实现类进行注册,如:

    //mbean注册
    MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
    ObjectName name = new ObjectName("staticConfigManagerMBean:name=staticConfigManager");
    mBeanServer.registerMBean(new StaticConfigManager(), name);
    
  4. 在应用程序开启监听端口,方式有两种,程序中开启和启动类添加参数开启。

    • 方式一,程序中开启,如:

      //开启jmx监听端口10014
      LocateRegistry.createRegistry(10014);
      //指定监控对象及名称
      JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:10014/jmxrmi");
      JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, mBeanServer);
      //开启监控
      jmxConnectorServer.start();
      
    • 方式二,启动类添加参数开启,如:

      -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.port=10014 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
      
  5. 启动java工具jconsole,并远程连接,连接地址如:

    localhost:10014
    
  6. 在jconsole连接成功后,在界面MBean中,调用自定义的MBean接口实现。

三、示例

这里以操作静态类StaticConfig的MBean管理为例。

3.1 示例项目

  1. 定义表态类

    package com.dragon.study.spring_boot_main;
    public class StaticConfig {
        //自定义静态属性
        public static String configName="apple";
    
        //自定义静态方法
        public static String sayHello(){
            return "hello " + configName;
        }
    }
    
  2. 定义MBean
    MBean接口如下:

    package com.dragon.study.spring_boot_main.mbean;
    public interface StaticConfigManagerMBean {
        String printConfigName();
        void changeConfigName(String configName);
    }
    

    MBean接口实现类如下:

    package com.dragon.study.spring_boot_main.mbean;
    import com.dragon.study.spring_boot_main.StaticConfig;
    public class StaticConfigManager implements StaticConfigManagerMBean {
        @Override
        public String printConfigName() {
            System.out.println("StaticConfigManager, configName:" + StaticConfig.configName);
            return StaticConfig.configName;
        }
        @Override
        public void changeConfigName(String configName) {
            StaticConfig.configName = configName;
        }
    }
    
  3. 启动类里注册MBean及开启监控端口

    package com.dragon.study.spring_boot_main;
    import com.dragon.study.spring_boot_main.mbean.StaticConfigManager;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import javax.management.MBeanServer;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnectorServer;
    import javax.management.remote.JMXConnectorServerFactory;
    import javax.management.remote.JMXServiceURL;
    import java.lang.management.ManagementFactory;
    import java.rmi.registry.LocateRegistry;
    
    @SpringBootApplication
    public class SpringBootMainApplication {
        public static void main(String[] args) throws Exception {
            SpringApplication.run(SpringBootMainApplication.class, args);
            //主动加载静态类
            Class.forName("com.dragon.study.spring_boot_main.StaticConfig");
    
            //mbean注册
            MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
            ObjectName name = new ObjectName("staticConfigManagerMBean:name=staticConfigManager");
            mBeanServer.registerMBean(new StaticConfigManager(), name);
    
            //开启jmx监听端口10014
            LocateRegistry.createRegistry(10014);
            //指定监控对象及名称
            JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:10014/jmxrmi");
            JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, mBeanServer);
            //开启监控
            jmxConnectorServer.start();
        }
    }
    

3.2 测试

测试如下:

  1. 命令行输入jconsole,弹出界面选择远程连接,输入地址localhost:10014;
  2. 进程jconsole界面后,选择MBean界面,对自定义MBean进行调用,如:
    • staticConfigManagerMBean -> staticConfigManager -> 操作 -> changeConfigName,打印静态类的静态属性;
    • staticConfigManagerMBean -> staticConfigManager -> 操作 -> printConfigName,修改静态类的静态属性;

版权声明:本文为chinabestchina原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。