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