Jmx 学习

2017-12-31  本文已影响124人  jwfy

jmx全称是Java Management Extensions 是java的一种扩展管理工具,可以通过网页或者客户端的方式管理正在运行的java服务,例如Tomcat的容器停止或者重启。Tomcat基于jmx开发的,Jboss也是类似的,数据库连接池druid也有同样的功能。拥有jmx意味着可以通过在页面上动态调整服务。如下图jmx架构图

image.png

由上面的图片可以看出mbean分为三层,分别是基础层、代理层,远程管理层

StandardMBean

使用StandardMBean 必须为每一个MBean定义一个接口,而且名字限定为xxxMBean

// 接口
public interface DemoMBean {

    public String getName();
    public int getAge();
    public void setName(String name);
    public void setAge(int age);
    void init();
}

// 具体实现
public class Demo implements DemoMBean {

    private String name;
    private int age;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getAge() {
        return age;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void init() {
        this.age = 10;
        this.name = "hehehehehe";
    }
}

// agent
public class DemoAgent {

    public static void main(String[] args)  {
        try {
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
            String domainName = "DemoMBean";
            // 为MBean(下面的new Hello())创建ObjectName实例
            ObjectName demo = new ObjectName(domainName + ":name=Demo");

            // 将demo对象注册到MBeanServer上去
            server.registerMBean(new Demo(), demo);

            Thread.sleep(60*60*1000);
            // demo而已,便于测试,加上了这个线程睡眠

        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

image.png

// 系统默认的赋值


image.png

// 触发init方法


image.png

// 触发init函数,运行完值已经发生变化了


image.png

这样我们就可以在本地通过jconsole动态修改了服务内的数据,在实际发开中,存在修改线上配置文件的属性,除了重新部署修改之外,也可以通过类似的方案实现。

除了本地jconsole工具管理mbean,还可以通过rmi、http等方式管理,原理也类似,遵循jmx的使用协议,在原本写好的agent上再包装一层提供给外界使用。

参考链接

上一篇下一篇

猜你喜欢

热点阅读