• JMX基本概念


    Object name的语法

    1. 形似 com.sun.someapp:type=Whatsit,name=25
    2. com.sun.someapp 是domain,冒号后面的是key-property-list,每组kv的顺序随意,但是不能有空格,空格字符有特殊含义,不能有冒号。domain名不能含有冒号,不能含有/。
    3. key-property-list中的key支持和?somedomain:type=Thread,
    4. 支持逗号连接多个值作为条件,com.sun.someapp:type=Whatsit,name="25,26"
    5. 整个Object name大小写敏感
    6. Object name预定之一 用java package的形式开头来命名
    7. 每个对象名应该包含一个type= key 属性.
      具体可以参见官方文档Java Management Extensions (JMX) - Best Practices

    四种bean概念

    JMX标准提供了四种不同的 MBean:

    1. Standard MBean
      Standard MBean是JMX管理构件中最简单的一种,只需要开发一个MBean接口(为了实现Standard MBean,必须遵循一套继承规范。必须每一个MBean定义一个接口,而且这个接口的名字必须是其被管理的资源的对象类的名称后面加上"MBean"),一个实现MBean接口的类,并且把它们注册到MBeanServer中就可以了。
    2. Dynamic MBean
      不再需要为没个bean定义接口了,可以实现javax.management.DynamicMBean做成通用的。tomcat大量使用。 用属性访问器动态地访问属性,并用一个一般化的 invoke() 方法调用方法。可用的方法是在 MBeanInfo 接口中指定的。这种方式更灵活,但是不具有像 Standard MBean 那样的类型安全性。它极大地降低了耦合性,可管理的 POJO(纯粹的老式 Java 对象)不需要实现特定的接口。
    3. Model MBean
      配合javax.management.modelmbean.RequiredModelMBean使用。提供了一个改进的抽象层,并扩展了 Dynamic MBean 模型以进一步减少对给定实现的依赖性。这对于可能使用多个版本的 JVM 或者需要用松散耦合管理第三方类的情况会有帮助。Dynamic MBean 与 Model MBean 之间的主要区别是,在 Model MBean 中有额外的元数据。
    4. Open MBean
      是受限的 Model MBean,它限制类型为固定的一组类型,以得到最大的可移植性。通过限制数据类型,可以使用更多的适配器,并且像 SMTP 这样的技术可以更容易适应 Java 应用程序的管理。这种变体还指定了数组和表等标准结构以改进复合对象的管理。

    四种bean示例

    Standard MBean 示例

    package test;
    
    import java.io.IOException;
    import java.lang.management.ManagementFactory;
    
    import javax.management.InstanceAlreadyExistsException;
    import javax.management.MBeanRegistrationException;
    import javax.management.MBeanServer;
    import javax.management.MBeanServerFactory;
    import javax.management.MalformedObjectNameException;
    import javax.management.NotCompliantMBeanException;
    import javax.management.ObjectName;
    
    /**
     * @since 2019-11-16
     *
     */
    public class JMXMBeanTest {
    
    	/**
    	 * @param args
    	 * @throws MalformedObjectNameException
    	 * @throws NotCompliantMBeanException
    	 * @throws MBeanRegistrationException
    	 * @throws InstanceAlreadyExistsException
    	 * @throws IOException
    	 */
    	public static void main(String[] args) throws MalformedObjectNameException, InstanceAlreadyExistsException,
    			MBeanRegistrationException, NotCompliantMBeanException, IOException {
    		MBeanServer mBeanServer = null;
    		if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
    			mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
    		} else {
    			mBeanServer = ManagementFactory.getPlatformMBeanServer();
    		}
    		ObjectName jmxObjectName = new ObjectName("jxmstudy:name=HelloWord");
    		Hello hello = new Hello();
    		hello.setName("Simon");
    		mBeanServer.registerMBean(hello, jmxObjectName);
    		System.in.read();
    	}
    
    	public static interface HelloMBean {
    
    		public String getName();
    
    		public void setName(String name);
    
    	}
    
    	public static class Hello implements HelloMBean {
    
    		private String name;
    
    		@Override
    		public String getName() {
    			return this.name;
    		}
    
    		@Override
    		public void setName(String name) {
    			this.name = name;
    		}
    	}
    
    }
    

    Dynamic MBean示例

    可以用 commons-modeler-2.0.1.jar完成,也可以参见tomcat的代码
    具体做法是用配置文件描述mbean定义,然后走一个他自己开发的mbean公共机制完成注册,比如 org/apache/catalina/connector/mbeans-descriptors.xml 就是tomcat连接器jmx bean的描述。它有很多mbeans-descriptors.xml配置文件,针对不同组件各组件一个。
    Tomcat7中的JMX使用(二)Dynamic MBean 这篇文章分析了。

    Model MBean示例

    ————————————————
    版权声明:本文为CSDN博主「朱小厮」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u013256816/article/details/52817247

    package com.test.jmx.modelBean;
    
    
    import javax.management.*;
    import javax.management.modelmbean.*;
    
    /**
     * Created by hidden on 2016/10/9.
     */
    public class ModelMBeanUtils {
        private static final boolean READABLE = true;
        private static final boolean WRITABLE = true;
        private static final boolean BOOLEAN = true;
        private static final String STRING_CLASS = "java.lang.String";
        public static RequiredModelMBean createModelerMBean() {
            RequiredModelMBean model = null;
            try {
                model = new RequiredModelMBean();
                model.setManagedResource(new Hello(), "ObjectReference");
                ModelMBeanInfo info = createModelMBeanInfo();
                model.setModelMBeanInfo(info);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return model;
        }
        private static ModelMBeanInfo createModelMBeanInfo() {
            //////////////////////////////////////////////////////////////////
            //                        属性                                        //
            //////////////////////////////////////////////////////////////////
            // 构造name属性信息
            Descriptor portAttrDesc = new DescriptorSupport();
            portAttrDesc.setField("name", "Name");
            portAttrDesc.setField("descriptorType", "attribute");
            portAttrDesc.setField("displayName", "Name");
            portAttrDesc.setField("getMethod", "getName");
            portAttrDesc.setField("setMethod", "setName");
            ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
                    "Name", // 属性名
                    STRING_CLASS, //属性类型
                    "people name", // 描述文字
                    READABLE, WRITABLE, !BOOLEAN, // 读写
                    portAttrDesc // 属性描述
            );
            //////////////////////////////////////////////////////////////////
            //                        方法                                        //
            //////////////////////////////////////////////////////////////////
            // 构造 getName操作描述符信息
            Descriptor getStateDesc = new DescriptorSupport(new String[] {
                    "name=getName",
                    "descriptorType=operation",
                    "class=com.test.jmx.modelBean.Hello",
                    "role=operation"
            });
    
            ModelMBeanOperationInfo getName = new ModelMBeanOperationInfo(//
                    "getName", //
                    "get name attribute", //
                    null, //
                    "java.lang.String", //
                    MBeanOperationInfo.ACTION, //
                    getStateDesc //
            );
    
            // 构造 setName操作描述符信息
            Descriptor setStateDesc = new DescriptorSupport(new String[] {
                    "name=setName", "descriptorType=operation", "class=com.test.jmx.modelBean.Hello",
                    "role=operation" });
    
            MBeanParameterInfo[] setStateParms = new MBeanParameterInfo[] { (new MBeanParameterInfo(
                    "name", "java.lang.String", "new name value")) };
    
            ModelMBeanOperationInfo setName = new ModelMBeanOperationInfo(//
                    "setName", //
                    "set name attribute", //
                    setStateParms, //
                    "void", //
                    MBeanOperationInfo.ACTION, //
                    setStateDesc //
            );
    
            //构造 printHello()操作的信息
            ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//
                    "printHello", //
                    null, //
                    null, //
                    "void", //
                    MBeanOperationInfo.INFO, //
                    null //
            );
            // 构造printHello(String whoName)操作信息
            ModelMBeanOperationInfo print2Info;
            MBeanParameterInfo[] param2 = new MBeanParameterInfo[1];
            param2[0] = new MBeanParameterInfo("whoName", STRING_CLASS, "say hello to who");
            print2Info = new ModelMBeanOperationInfo(//
                    "printHello", //
                    null,//
                    param2,//
                    "void", //
                    MBeanOperationInfo.INFO, //
                    null//
            );
            //////////////////////////////////////////////////////////////////
            //                        最后总合                                    //
            //////////////////////////////////////////////////////////////////
            // create ModelMBeanInfo
            ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
                    RequiredModelMBean.class.getName(), // MBean类
                    null, // 描述文字
                    new ModelMBeanAttributeInfo[] { // 所有的属性信息(数组)
                            nameAttrInfo },//只有一个属性
                    null, // 所有的构造函数信息
                    new ModelMBeanOperationInfo[] { // 所有的操作信息(数组)
                            getName,
                            setName,
                            print1Info,
                            print2Info },//
                    null, // 所有的通知信息(本例无)
                    null//MBean描述
            );
            return mbeanInfo;
        }
    }
    

    启动参数

    简答配置如:
    -Dcom.sun.management.jmxremote.port=8085
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false

  • 相关阅读:
    用addOnGlobalLayoutListener获取View的宽高
    用addOnGlobalLayoutListener获取View的宽高
    用addOnGlobalLayoutListener获取View的宽高
    ElasticSearch封装查询、多条件查询、模糊查询工具类
    java操作ElasticSearch(es)进行增删查改操作
    如何构建尽可能小的容器镜像?
    perl 合并日志处理+并发管理器
    NoSQL还是SQL?这一篇讲清楚
    perl 跨行匹配 /s
    perl 改变换行符 合并日志
  • 原文地址:https://www.cnblogs.com/simoncook/p/11883569.html
Copyright © 2020-2023  润新知