潦草白纸

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

posted on 2020-01-08 12:11  潦草白纸  阅读(390)  评论(0)    收藏  举报

导航