TFdream / blog

个人技术博客,博文写在 Issues 里。
Apache License 2.0
129 stars 18 forks source link

玩转JMX系列 — 简介和Standard MBean #364

Open TFdream opened 3 years ago

TFdream commented 3 years ago

JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展。这种机制可以方便的管理、监控正在运行中的Java程序。常用于管理线程,内存,日志Level,服务重启,系统环境等。

Standard MBean

Standard MBean的设计和实现是最简单的,它们的管理接口通过方法名来描述。Standard MBean的实现依靠一组命名规则,称之为设计模式。这些命名规则定义了属性和操作。

检查Standard MBean接口和应用设计模式的过程被称为内省(Introspection)。JMX代理通过内省来查看每一个注册在MBeanServer上的MBean的方法和超类,看它是否遵从一定设计模式,决定它是否代表了一个MBean,并辨认出它的属性和操作。

Standard MBean是JMX管理构件中最简单的一种,只需要开发一个MBean接口(为了实现Standard MBean,必须遵循一套继承规范。必须每一个MBean定义一个接口,而且这个接口的名字必须是其被管理的资源的对象类的名称后面加上"MBean"),一个实现MBean接口的类,并且把它们注册到MBeanServer中就可以了。

1、Standard MBean示例

首先,定义MBean接口:

public interface HelloMBean {
    String getName();
    void setName(String name);

    String hello();
    String eat(String food);
    String wash(String clothes);
}

MBean接口实现:

public class Hello implements HelloMBean {
    private String name;

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

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

    @Override
    public String hello() {
        return "hello, "+name;
    }

    @Override
    public String eat(String food) {
        return "eat "+food;
    }

    @Override
    public String wash(String clothes) {
        return "wash "+clothes;
    }
}

MBean注册:

import javax.management.*;
import java.lang.management.ManagementFactory;
import java.util.concurrent.TimeUnit;

public class MBeanAgent {

    public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException {
        // 下面这种方式不能再JConsole中使用
        //MBeanServer server = MBeanServerFactory.createMBeanServer();

        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        String domainName = "MyMBean";

        ObjectName helloName = new ObjectName(domainName+":name=HelloWorld");
        // 将new Hello()这个对象注册到MBeanServer上去
        mbs.registerMBean(new Hello(), helloName);

        TimeUnit.MINUTES.sleep(10);
    }
}

相关资料