[JMX-MBean]JMX简介

[JMX-MBean]JMX简介

一、JMX的定义

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

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

二、JMX架构图:


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

  • 1、基础层:主要是MBean,被管理的资源,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、接入层:提供远程访问的入口。

二、JMX使用实例

//HelloJmxMBean.java
package cn.apediary.jmx;
public interface HelloJmxMBean { //名字定义:类名+MBean
    public String getName();
    public void setName(String name);

    public String printHello();
    public String printHello(String whoName);
}
//HelloJmx.java
package cn.apediary.jmx;
public class HelloJmx implements HelloJmxMBean{
    private String name;
    @Override
    public String getName() {
        return name;
    }
    @Override
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String printHello() {
        System.out.println("Hello World,"+name);
        return "Hello World,"+name;
    }
    @Override
    public String printHello(String whoName) {
        System.out.println("Hello,"+whoName);
        return "Hello,"+whoName;
    }
}
//JmxAgent.java
package cn.apediary.jmx;
import com.sun.jdmk.comm.HtmlAdaptorServer;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;

public class JmxAgent {
    public static void main(String[] args) throws Exception {
        //先创建了一个MBeanServer,用来做MBean的容器
        MBeanServer server = MBeanServerFactory.createMBeanServer();
        //MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        ObjectName helloName = new ObjectName("alpha:name=HelloWorld");
        HelloJmx hello=new HelloJmx();
        //将Hello这个类注入到MBeanServer中,注入需要创建一个ObjectName类
        server.registerMBean(hello, helloName);
        //创建一个AdaptorServer,这个类将决定MBean的管理界面,这里用最普通的Html型界面。AdaptorServer其实也是一个MBean。
        // alpha:name=HelloWorld的名字是有一定规则的,格式为:“域名:name=MBean名称”,域名和MBean名称都可以任意取。
        ObjectName adapterName = new ObjectName("JmxAgent:name=htmladapter,port=8082");
        HtmlAdaptorServer adapter = new HtmlAdaptorServer();
        server.registerMBean(adapter, adapterName);
        adapter.start();
        System.out.println("start.....");
    }
}

必须收到加入jmxtools.jar包,jdk中没有。启动JmxAgent然后就可以在http://localhost:8082/中执行printHello和修改name的值,网页和控制台都会有相应的输出。

文献

JMX超详细解读
JMX简单学习
JDK中的JMX实现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值