JMX详解以及使用示例

本文详细介绍了Java Management Extensions (JMX)的概念、架构,并深入讲解了标准MBean、开放类型MBean(MXBean)以及动态MBean的使用,包括定义接口、实现、注册和调用。此外,还探讨了如何通过Web管理MBean以及客户端调用MBean的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

目录

JMX是什么   

JMX架构

MBean

标准MBean

 定义接口

实现接口

注册MBean

使用MBean

 如何通过Web管理MBean

开放类型MBean

自定义参数

MXBean接口定义

MXBean接口实现

MXBean注册

 访问MXBean

动态MBean

如何使用客户端调用MBean



JMX是什么   

    JMX(Java Management Extensions)是一个为应用程序植入管理功能的标准化代理和服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等。JConsole以及JVisualVM 都是通过JMX来实现对JAVA应用程序的监控。

JMX架构

  MBean是JMX中被管理的资源。MBean全部都是由MBeanServer统一管理,并通过MBeanServer对外提供的访问接口提供服务。

MBean

JMX定义了四种类型的MBean,标准MBean,动态MBean,开放MBean和模型MBean

  1. 标准MBean是最简单的实现,他们的管理接口是通过方法名描述的。MXBean是是一种标准的MBean,它使用开放的MBean概念,在简化代码的同事,达到易于管理的目的。
  2. 动态MBean必须实现特定的接口,但是他们在运行时对外提供管理接口,所以具有很大的灵活性。
  3. 开放MBean是动态MBean
  4. 模型MBean也是动态MBean,它是运行时完全可配置和自我描述的。它们为动态设备层资源提供具有默认行为的一般MBean类。

任何一个作为MBean的java实现的java对象,被注册到代理上后,都可以从代理机构的JVM外管理。因此,应用程序中使用JMX只需要两步:

  1. 编写MBean提供管理接口和监控数据
  2. 将MBean注册到MBeanServer

下面本别就四种MBean去看看如何使用

标准MBean

  标准MBean是最简单的MBean类型,主要步骤如下:

 定义接口

/**
 *定义一个普通的接口
 *
 * @author zhangwei_david
 * @version $Id: HiMBean.java, v 0.1 2015年1月24日 下午1:16:15 zhangwei_david Exp $
 */
public interface HiMBean {
    /**
     *打招呼
     */
    public void sayHello();

    /**
     * 加法计算器
     *
     * @param x
     * @param y
     * @return
     */
    public int add(int x, int y);

    /**
     * 获取名称
     *
     * @return
     */
    public String getName();

    /**
     *获取缓存大小
     *
     * @return
     */
    public int getCacheSize();

    /**
     *设置缓存大小
     *
     * @param size
     */
    public void setCacheSize(int size);
}

实现接口


/**
 *简单实现类
 * @author Lenovo
 * @version $Id: Hi.java, v 0.1 2014年9月26日 下午2:48:09 Lenovo Exp $
 */
public class HiMbeanImpl implements HiMBean {

    private final String     name               = "Reginald";
    private int              cacheSize          = DEFAULT_CACHE_SIZE;
    private static final int DEFAULT_CACHE_SIZE = 200;

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#sayHello()
     */
    public void sayHello() {
        System.out.println("Hello," + getName());
    }

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#add(int, int)
     */
    public int add(int x, int y) {
        return x + y;
    }

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#getName()
     */
    public String getName() {
        return name;
    }

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#getCacheSize()
     */
    public int getCacheSize() {
        return cacheSize;
    }

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#setCacheSize(int)
     */
    public void setCacheSize(int size) {
        cacheSize = size;
    }

}

注册MBean

/**
 * 
 * 
 * @author zhangwei_david
 * @version $Id: Main.java, v 0.1 2015年6月19日 下午1:10:03 zhangwei_david Exp $
 */
public class Main {

    /**
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //获取Mean的平台服务
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        // 对即将被注册的MBean 构造一个ObjectName
        ObjectName objectName = new ObjectName("com.cathy.demo.jmx:type=Hi");
        // 创建一个Mbean
        RequiredModelMBean mbean = new RequiredModelMBean();
        HiMbeanImpl hiMbean = new HiMbeanImpl();
        mbean.setManagedResource(hiMbean, "objectReference");

        ModelMBeanAttributeInfo name = new ModelMBeanAttributeInfo("name", "java.lang.String",
            "userName", true, true, false, new DescriptorSupport(new String[] { "name=name",
                    "descriptorType=attribute", "getMethod=getName", "setMethod=setName" }));

        ModelMBeanOperationInfo sayHello = new ModelMBeanOperationInfo("say Hello", hiMbean
            .getClass().getMethod("sayHello"));
        // 创建一个ModelMBeanOperationInfo
        ModelMBeanOperationInfo getName = new ModelMBeanOperationInfo("get userName", hiMbean
            .getClass().getMethod("getName"));

        // 使用ModelMbeanAttributeInfo和ModelMbeanOperationInfo构建一个ModelMBeanInfo对象
        ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport("HiMbean", "Test",
            new ModelMBeanAttributeInfo[] { name }, null, new ModelMBeanOperationInfo[] { sayHello,
                    getName }, null);
        // 向ModelMBean 设置ModelMBeanInfo
        mbean.setModelMBeanInfo(mbeanInfo);

        // 将Mbean 注册到MBeanServer
        mbs.registerMBean(mbean, objectName);
        // 一直等待
        System.out.println("Waiting forever...");
        Thread.sleep(Long.MAX_VALUE);

    }
}

使用MBean

运行后的可以通过jconsole看到MBean

此时可以发现无法通过Web去管理MBean,那么如何通过Web去管理呢?

 如何通过Web管理MBean

  要想通过Web去管理MBean需要创建一个HtmlAdapterServer,并将其注册到MBeanServer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈脩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值