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效果:
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類中的方法(這是由於繼承類中的方法也會被顯示)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章