JMX快速认知

一、介绍

JMX名词解释Java Management Extensions,即Java管理扩展。

能做什么

管理应用、查看设备信息、查看应用资源、监听资源变化

调用方面

支持跨平台、多协议(soap、http、html、snmp、jconsole)

二、历史变迁

起草时间 JSR编号 主题 描述 是否启用 状态 原因 提交方
14 Dec, 1998 3 JMX 1.1和1.2 制定JMX规范,为Web、分布式、动态性和模块化方案等,提供管理体系架构 撤销 在Java 5.2版本成为了Oracle公司商标 Sun MicrosystemsConsumer & EmbeddedEmbedded System Software Group
30 May,2000 70 JMX 适配IIOP协议 规范建立基于IIOP协议的适配器,以支持CORBA客户端访问JMX代理 撤销 企业战略调整,不看好JMX在CORBA客户端的应用 IONA Technologies PlcBen Beazley
27 Jun, 2000 71 JMX-TMN定义 规范电信管理网络(TMN)和JMX之间的互操作性 撤销 应规范负责人要求撤回,JSR3中已提及这块支持,只是一直没实现 Bull S.A. (BullSoft)
21 Aug, 2001 146 JMX 支持WBem服务 定义对于WBEM 服务提供协议适配器 撤销 JSR48 WBEN规范服务,由WBEN Solutions, Inc.提出。两家公司在提出此规范,一年半以后,合作停止 Sun Microsystems, Inc.
27 Nov, 2001 160 JMX 远程调用API 该API扩展了JMX1.2API,提供对JMX MBean服务器的远程访问。 撤销 与jsr3相同原因 Sun Microsystems,Inc.
21 Sep, 2004 255 JMX 2.0 更新JMX和JMX远程 API。改善现有功能可用性并添加新功能。 撤销 企业战略调整 Sun Microsystems,Inc.
07 Dec, 2004 262 JMX 支持Web Services连接 定义JMX支持Web Services支持非Java客户端。 撤销 企业战略调整 Sun Microsystems,Inc.

可以看出JMX技术完全由Sun公司主导,被收购后没有新的规范被提出。实际被启用的只有sun公司所提交的3、160、262。

三、代码示例

具体地管理应用、查看设备信息、查看应用资源、监听资源变化,这些怎么实现的呢?

定义接口

//接口名必须以MBean结尾
public interface HelloMBean {
    String getName();

    void setName(String name);

    void printHello();
}

实现类

//类名必须和接口MBean前的内容相同,即类名+MBean必须等于接口名
public class Hello extends NotificationBroadcasterSupport implements HelloMBean {
    private AtomicLong sequenceNumber = new AtomicLong(1);
    private String name;

    @Override
    public void printHello() {
        System.out.println("你好," + name);
    }

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

    @Override
    public void setName(String name) {
        String oldName = this.name;
        this.name = name;
        //通知方法
        Notification notification = new AttributeChangeNotification(this,
                sequenceNumber.getAndIncrement(),
                System.currentTimeMillis(),
                AttributeChangeNotification.ATTRIBUTE_CHANGE,
                "Name Change",
                "java.lang.String",
                oldName + "",
                this.name + "");
        super.sendNotification(notification);
    }
}

Main方法

public class StandardMBeanMain {
    public static void main(String[] args) throws Exception {
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        ObjectName objName = new ObjectName("MBeanTest2:type=StandardMBean");
        mBeanServer.registerMBean(new Hello(), objName);
        mBeanServer.addNotificationListener(objName, new HelloListener(), null, null);
        Thread.sleep(60 * 60 * 1000);
    }
}

监听类

public class HelloListener implements NotificationListener {
    @Override
    public void handleNotification(Notification notification, Object handback) {
        log("SequenceNumber:" + notification.getSequenceNumber());
        log("Type:" + notification.getType());
        log("Message:" + notification.getMessage());
        log("Source:" + notification.getSource());
        log("TimeStamp:" + notification.getTimeStamp());
        log("UserData:" + notification.getUserData());
        log("oldValue:" + ((AttributeChangeNotification)notification).getOldValue());
        log("newValue" + ((AttributeChangeNotification)notification).getNewValue());
        log("attributeName:" + ((AttributeChangeNotification)notification).getAttributeName());
        log("=========" + notification.toString());
    }

    private void log(String message) {
        System.out.println(message);
    }
}

jconsole连接示例

ObjectName("MBeanTest2:type=StandardMBean")

查看bean属性信息,同时通过set方法支持修改bean属性

操作支持调用void方法

监听Notification 声明内容

四、Tomcat中jmx的实现逻辑

tomcat中所有组件都实现了Lifecycle接口,管理组件的加载、初始化、启动、关闭等生命周期。

在LifecycleMBeanBase抽象类中有抽象方法getObjectName,由各个组件实现以支持不同的监控项名称查询路由。

在LifecycleMBeanBase抽象类中initInternal方法,把各个子类的MBean注册到MBeanServer中。

至于后面的监听,则可以从本文提供的jconsole示例来管理、查看这些MBean。

引用

https://www.jcp.org/en/jsr/detail?id=3
https://www.jcp.org/en/jsr/detail?id=70
https://www.jcp.org/en/jsr/detail?id=71
https://www.jcp.org/en/jsr/detail?id=146
https://www.jcp.org/en/jsr/detail?id=160
https://www.jcp.org/en/jsr/detail?id=255
https://www.jcp.org/en/jsr/detail?id=262

原文地址:https://www.cnblogs.com/snifferhu/p/12058166.html