tomcat源码解读三(1) tomcat的jmx管理

    JMX即Java 管理扩展(Java Management Extensions,JMX)用来管理检测 Java 程序(同时 JMX 也在 J2EE 1.4 中被发布)它的作用是可以在程序运行的时候对其进行动态处理,调用相应方法来进行对指定属性值进行修改,在下面我将以代码结合jconsole进行分析(注意:在实际的程序管理过程中并不支持使用jconsole,因为它是一个java的客户端)源代码在下一节进行分析

1.1 tomcat中JMX的使用Demo

    请注意这个JMX的展示仅仅针对与tomcat中的,因为tomcat对JMX做了改动,导致setter和getter方法不显示以及其他相关属性操作展示与原生jmx有所出入

1.1.1 java代码: 父类:

public class MbeanTestExtend {

    private String unSetGetAttrP;

    private String onlySetAttrP;

    private String onlyGetAttrP;

    private String includeSetGetAttrP;

    public void setOnlySetAttrP(String onlySetAttr) {
        this.onlySetAttrP = onlySetAttr;
    }

    public String getOnlyGetAttrP() {
        return onlyGetAttrP;
    }

    public String getIncludeSetGetAttrP() {
        return includeSetGetAttrP;
    }

    public void setIncludeSetGetAttrP(String includeSetGetAttrP) {
        this.includeSetGetAttrP = includeSetGetAttrP;
    }

    public String setAttrTestP(String attrTestP){
        return "attrTestP";
    }

    public void invokeMethodP(){
        System.out.println("invokeMethodP...");
    }

}

子类:

public class MBeanTest extends MbeanTestExtend implements MBeanRegistration{

    private String unSetGetAttr;

    private String onlySetAttr;

    private String onlyGetAttr;

    private String includeSetGetAttr;

    public void setOnlySetAttr(String onlySetAttr) {
        this.onlySetAttr = onlySetAttr;
    }

    public String getOnlyGetAttr() {
        return onlyGetAttr;
    }

    public String getIncludeSetGetAttr() {
        return includeSetGetAttr;
    }

    public void setIncludeSetGetAttr(String includeSetGetAttr) {
        this.includeSetGetAttr = includeSetGetAttr;
    }

    public String setAttrTest(String attrTest){
        return "attrTest";
    }

    public void invokeMethod(String value){
        System.out.println("传入值:"+value);
    }

    public String getUnHandle(){
        return "测试";
    }

    public String getDomain(){
        return "mainTest1";
    }

    public static void main(String[] args) throws IOException {

        //MBeanServer实例能够用MBeanServerFactory类提供的方法获取
        //MBeanServer mserver = null;

        MBeanTest mBeanTest = new MBeanTest();

        mBeanTest.register(mBeanTest, "type=MBeanTest");

        while (true){}
    }


    protected final ObjectName register(Object obj, String objectNameKeyProperties) {
        //根据domain构造一个对象名 形式一般 domain:type=className 这个最终构成 jmxStudy:type=mainTest
        //StringBuilder name = new StringBuilder(getDomain());
        StringBuilder name = new StringBuilder("jmxStudy");
        name.append(':');
        name.append(objectNameKeyProperties);
        ObjectName on = null;
        try {
            //将上面构建的对象名字符串转化为对应的对象
            on = new ObjectName(name.toString());
            //获取MBeans建模注册表并注册组件
            Registry.getRegistry(null, null).registerComponent(obj, on, null);
        } catch (MalformedObjectNameException e) {
            throw new RuntimeException(e.toString());
        } catch (Exception e) {
            throw new RuntimeException(e.toString());
        }
        return on;
    }

    @Override
    public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception {
        throw new RuntimeException("preRegister.......");

    }

    @Override
    public void postRegister(Boolean registrationDone) {
        throw new RuntimeException("postRegister.......");
    }

    @Override
    public void preDeregister() throws Exception {
        throw new RuntimeException("preDeregister.......");
    }

    @Override
    public void postDeregister() {
        throw new RuntimeException("postDeregister.......");
    }
}

1.1.2 jconsole效果:

1.1.3 结论: 1.无setter和getter方法的变量不会显示 2.有getter方法无setter方法的即使没有变量会去掉前面get然后显示属性 3.有setter方法无getter方法且无变量的不会显示 4.有setter方法无getter方法存在变量的属性会显示 5.由1 2 3 4可知一个属性是否显示跟其句柄和setter/getter方法有关 6.一个属性显示后仅当具有getter方法的则这个属性可读,在值的地方会显示 7.一个属性显示后仅当具有setter方法的则这个属性可写,在值得地方输入新值会进行更新 8.一个操作方法必须满足一下的条件才能显示并且实现调用    ①public修饰    ②不是static方法    ③不是setter/getter方法    ④不是Object类中的方法(这是由于继承类中的方法也会被显示)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我就是马云飞

BRAVH源码模拟

简介 BRAVH是一个recyclerView的adapter,能够快速适配多种类型adapter,可定制,用的人挺多,下面我们就来分析分析他的源码,模拟来写一...

1999
来自专栏技术博客

编写高质量代码改善C#程序的157个建议[泛型集合、选择集合、集合的安全]

    软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类。不管是数组还是集合类,它们都有各自的优缺点。如何使用好集合是我们在开发过程中必须...

542
来自专栏Python疯子

Python selenium — 一定要会用selenium的等待,三种等待方式解读

很多人在群里问,这个下拉框定位不到、那个弹出框定位不到…各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待。殊不知,你的代码运行速度是...

641
来自专栏阮一峰的网络日志

Generator 函数的含义与用法

本文是《深入掌握 ECMAScript 6 异步编程》系列文章的第一篇。 Generator函数的含义与用法 Thunk函数的含义与用法 co函数库的含义与...

3546
来自专栏码农阿宇

在.Net Core中使用MongoDB的入门教程(二)

在上一篇文章中,讲到了MongoDB在导入驱动、MongoDB的连接,数据的插入等。 在.Net Core中使用MongoDB的入门教程(一) 本篇文章将接...

2759
来自专栏超然的博客

前端相关片段整理——持续更新

在不同的接口请求数据然后拼合成自己所需的数据,通常这些接口之间没有关联(例如不需要前一个接口的数据作为后一个接口的参数)

711
来自专栏偏前端工程师的驿站

JS魔法堂:jQuery.Deferred(jQuery1.5-2.1)源码剖析

一、前言                              jQuery.Deferred作为1.5的新特性出现在jQuery上,而jQuery.aja...

2039
来自专栏移动端开发

iOS 开发之Block

iOS 开发之Block 一:什么是Block。Block的作用      UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法。     1.   ...

18410
来自专栏微信公众号:Java团长

Java中创建对象的5种方式

作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多创建对象的方法,我们会在这篇文章中学到。

781
来自专栏韩伟的专栏

框架设计原则和规范(完)

祝大家圣诞节快乐!有事没事别出门,外面太!挤!了! 此文是《.NET:框架设计原则、规范》的读书笔记,本文内容较多,共分九章,今天推送最后一章。 1. 什么是好...

2584

扫描关注云+社区