美文网首页
JMX编程-监控 管理Tomcat(demo篇)

JMX编程-监控 管理Tomcat(demo篇)

作者: wyatt_plus | 来源:发表于2017-12-05 21:02 被阅读0次

    一、JMX的定义

    JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。这是官方文档上的定义,我看过很多次也无法很好的理解。我个人的理解是JMX让程序有被管理的功能,例如你开发一个WEB网站,它是在24小时不间断运行,那么你肯定会对网站进行监控,如每天的UV、PV是多少;又或者在业务高峰的期间,你想对接口进行限流,就必须去修改接口并发的配置值。
    应用场景:中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则整个系统都基于JMX构架。

    那JMX有什么用了?其实一种思维的挖掘。

    1、程序初哥一般是写死在程序中,到要改变的时候就去修改代码,然后重新编译发布。
    2、程序熟手则配置在文件中(JAVA一般都是properties文件),到要改变的时候只要修改配置文件,但还是必须重启系统,以便读取配置文件里最新的值。
    3、程序好手则会写一段代码,把配置值缓存起来,系统在获取的时候,先看看配置文件有没有改动,如有改动则重新从配置里读取,否则从缓存里读取。
    4、程序高手则懂得物为我所用,用JMX把需要配置的属性集中在一个类中,然后写一个MBean,再进行相关配置。另外JMX还提供了一个工具页,以方便我们对参数值进行修改。

    二、JMX架构图:

    jmx

    从图中我们可以看到,JMX的结构一共分为三层:

    1、基础层:主要是MBean,被管理的资源。

    类型 描述
    standard MBean 这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。
    dynamic MBean 必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义
    open MBean 此MBean的规范还不完善,正在改进中
    model MBean 与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,Model MBean的管理资源也是在运行时定义的。与DynamicMBean不同的是,DynamicMBean管理的资源一般定义在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),只有在运行时,才通过set方法将其加入到model MBean中。后面的例子会有详细介绍

    MBean分为如下四种,我接下来主要介绍standard MBean

    类型 描述
    standard MBean 这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。
    dynamic MBean 必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义
    open MBean 此MBean的规范还不完善,正在改进中
    model MBean 与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,Model MBean的管理资源也是在运行时定义的。与DynamicMBean不同的是,DynamicMBean管理的资源一般定义在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),只有在运行时,才通过set方法将其加入到model MBean中。后面的例子会有详细介绍

    2、适配层:MBeanServer,主要是提供对资源的注册和管理。

    3、接入层:提供远程访问的入口。

    本文的资源:maven http://mvnrepository.com/artifact/com.sun.jdmk/jmxtools/1.2.1
    jar:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html

    接下来我这里会用程序来介绍三种访问JMX的方式:

    三、JDK的小工具Jconsole访问

    1、 首先定义一个MBean接口,接口的命名规范为以具体的实现类为前缀(这个规范很重要)

    package io.fredia;
    //必须以MBean结尾
    public interface FrediaMBean {
    
        public String getName();
    
        public void setName(String name);
    
        public String getAge();
    
        public void setAge(String age);
    
        public void helloWorld();
    
        public void helloWorld(String str);
    
        public void getTelephone();
        
        public void printHello(String whoName);
    }
    

    2、定义一个实现类,实现上面的接口:

    package io.fredia;
    
    /*
     * 该类名称必须与实现的接口的前缀保持一致(即MBean前面的名称)
     */
    public class Fredia implements FrediaMBean {
        
        private String name;
    
        private String age;
    
        public void getTelephone() {
            System.out.println("get Telephone");
        }
    
        public void helloWorld() {
            System.out.println("hello world");
        }
    
        public void helloWorld(String str) {
            System.out.println("helloWorld:" + str);
        }
    
        public String getName() {
            System.out.println("get name fredia");
            return name;
        }
    
        public void setName(String name) {
            System.out.println("set name fredia");
            this.name = name;
        }
    
        public String getAge() {
            System.out.println("get age 18");
            return age;
        }
    
        public void setAge(String age) {
            System.out.println("set age 18");
            this.age = age;
        }
    
        @Override
        public void printHello(String whoName) {
             System.out.println("Hello , " + whoName);
            
        }
        
    }
    

    3.定义agent层:

    package jmx;
    
    import java.lang.management.ManagementFactory;
    
    import javax.management.JMException;
    import javax.management.MBeanServer;
    import javax.management.ObjectName;
    
    public class FrediaAgent
    {
        public static void main(String[] args) throws JMException, Exception
        {
             MBeanServer server = ManagementFactory.getPlatformMBeanServer();
             ObjectName fredia= new ObjectName("jmxBean:name=hello");
             //创建一个mbean并且注册到server上去
             server.registerMBean(new Fredia(), fredia);
             Thread.sleep(60*60*1000);
        }
    }
    

    讲解:

    1、agent中是通过工厂类获取MBeanServer,用来做MBean的容器 。
    2、agent中的ObjectName中的取名是有一定规范的,格式为:“域名:name=MBean名称”,其中域名和MBean的名称可以任意取。这样定义后,就可以唯一标识我们定义的这个MBean的实现类了。
    3、server.registerMBean(new Fredia(), fredia);是将Fredia这个类注入到MBeanServer中,注入需要创建一个ObjectName类

    这样,一个简单的JMX的DEMO已经写完了,现在我们通过JDK提供的Jconsole来进行操作。

    step1:cmd指令输入jconsole执行
    jconsole
    step2:按照图中流程,进入mbean的操作步骤
    操作

    可以观看到左下角的控制台已经输出对应的信息了,一个简单的demo已经ok了,为我们后面的tomcat的监控打下基础。

    相关文章

      网友评论

          本文标题:JMX编程-监控 管理Tomcat(demo篇)

          本文链接:https://www.haomeiwen.com/subject/lrchixtx.html