設備層
該層定義了如何實現JMX管理資源的規範。一個JMX管理資源可以是一個Java套用、一個服務或一個設備,它們可以用Java開發,或者至少能用Java進行包裝,並且能被置入JMX框架中,從而成為JMX的一個管理構件(Managed Bean),簡稱MBean。管理構件可以是標準的,也可以是動態的,標準的管理構件遵從JavaBeans構件的設計模式;動態的管理構件遵從特定的接口,提供了更大的靈活性。
該層還定義了通知機制以及實現管理構件的輔助元數據類。
管理構件(MBean)
在JMX規範中,管理構件定義如下:它是一個能代表管理資源的Java對象,遵從一定的設計模式,還需實現該規範定義的特定的接口。該定義了保證了所有的管理構件以一種標準的方式來表示被管理資源。
管理接口就是被管理資源暴露出的一些信息,通過對這些信息的修改就能控制被管理資源。一個管理構件的管理接口包括:
1)能被接觸的屬性值;
2)能夠執行的操作;
3)能發出的通知事件;
4)管理構件的構建器。
管理構件通過公共的方法以及遵從特定的設計模式封裝了屬性和操作,以便暴露給管理應用程式。例如,一個唯讀屬性在管理構件中只有Get方法,既有Get又有Set方法表示是一個可讀寫的屬性。
其餘的JMX的構件,例如JMX代理提供的各種服務,也是作為一個管理構件註冊到代理中才能提供相應的服務。
JMX對管理構件的存儲位置沒有任何限制,管理構件可以存儲在運行JMX代理的Java虛擬機的類路徑的任何位置,也可以從網路上的任何位置導入。
JMX定義了四種管理構件:標準、動態、開放和模型管理構件。每一種管理構件可以根據不同的環境需要進行制定。
1.標準管理構件
標準管理構件的設計和實現是最簡單的,它們的管理接口通過方法名來描述。標準管理構件的實現依靠一組命名規則,稱之為設計模式。這些命名規則定義了屬性和操作。檢查標準管理構件接口和套用設計模式的過程被稱為內省(Introspection)。JMX代理通過內省來查看每一個註冊在MBean 伺服器上的管理構件的方法和超類,看它是否遵從一定設計模式,決定它是否代表了一個管理構件,並辨認出它的屬性和操作。
2.動態管理構件
動態管理構件提供了更大的靈活性,它可以在運行期暴露自己的管理接口。它的實現是通過實現一個特定的接口DynamicMBean(如下圖)。
JMX代理通過getMBeanInfo方法來獲取該動態管理構件暴露的管理接口,該方法返回的對象是MbeanInfo類的實例,包含了屬性和操作的簽名。由於該方法的調用是發生在動態管理構件向MBean伺服器註冊以後,因此管理接口是在運行期獲取的。不同於標準管理構件,JMX代理不需要通過內省機制來確定動態管理構件的管理接口。由於DynamicMBean的接口是不變的,因此可以禁止實現細節。由於這種在運行期獲取管理接口的特性,動態管理構件提供了更大的靈活性。
3.開放管理構件
開放管理構件是一種專門化的動態管理構件,其中所有的與該管理構件相關的參數、返回類型和屬性都圍繞一組預定義的數據類型(String、Integer、Float 等)來建立,並且通過一組特定的接口來進行自我描述。JMX代理通過獲得一個OpenMBeanInfo對象來獲取開放管理構件的管理接口,OpenMBeanInfo是MbeanInfo的子類。
4.模型管理構件
模型管理構件也是一種專門化的動態管理構件。它是預製的、通用的和動態的 MBean 類,已經包含了所有必要預設行為的實現,並允許在運行時添加或復蓋需要定製的那些實現。JMX規範規定該類必須實現為javax.management.modelmbean.RequiredModelMBean,管理者要做的就是實例化該類,並配置該構件的默認行為並註冊到JMX代理中,即可實現對資源的管理。JMX代理通過獲得一個ModelMBeanInfo對象來獲取管理接口。
模型管理構件具有以下新的特點:
1)持久性
定義了持久機制,可以利用Java的序列化或JDBC來存儲模型MBean的狀態。
2)通知和日誌功能
能記錄每一個發出的通知,並能自動發出屬性變化通知。
3)屬性值快取
具有快取屬性值的能力。
通知模型
一個管理構件提供的管理接口允許代理對其管理資源進行控制和配置。然而,對管理複雜的分散式系統來說,這些接口只是提供了一部分功能。通常,管理應用程式需要對狀態變化或者當特別情況發生變化時作出反映。
為此,JMX定義了通知模型。通知模型僅僅涉及了在同一個JMX代理中的管理構件之間的事件傳播。JMX通知模型依靠以下幾個部分:
1)Notification,一個通用的事件類型,該類標識事件的類型,可以被直接使用,也可以根據傳遞的事件的需要而被擴展。
2)NotificationListener接口,接受通知的對象需實現此接口。
3)NotificationFilter接口,作為通知過濾器的對象需實現此接口,為通知監聽者提供了一個過濾通知的過濾器。
4)NotificationBroadcaster接口,通知傳送者需實現此接口,該接口允許希望得到通知的監聽者註冊。
傳送一個通用類型的通知,任何一個監聽者都會得到該通知。因此,監聽者需提供過濾器來選擇所需要接受的通知。
任何類型的管理構件,標準的或動態的,都可以作為一個通知傳送者,也可以作為一個通知監聽者,或兩者都是。
輔助元數據類
輔助元數據類用來描述管理構件。輔助元數據類不僅被用來內省標準管理構件,也被動態管理構件用來進行自我描述。這些類根據屬性、操作、構建器和通告描述了管理接口。JMX代理通過這些元數據類管理所有管理構件,而不管這些管理構件的類型。
部分輔助元類如下:
1)MBeanInfo--包含了屬性、操作、構建器和通知的信息。
2)MBeanFeatureInfo--為下面類的超類。
3)MBeanAttributeInfo--用來描述管理構件中的屬性。
4)MBeanConstructorInfo--用來描述管理構件中的構建器。
5)MBeanOperationInfo--用來描述管理構件中的操作。
6)MBeanParameterInfo--用來描述管理構件操作或構建器的參數。
7)MBeanNotificationInfo--用來描述管理構件發出的通知。
服務層
當前,SUN並沒有給出這一層的具體規範,下面給出的只是一個簡要描述。
該層規定了實現JMX套用管理平台的接口。這一層定義了能對代理層進行操作的管理接口和組件。這些組件能:
1)為管理應用程式提供一個接口,以便它通過一個連線器能透明和代理層或者JMX管理資源進行互動。
2)通過各種協定的映射(如SNMP、HTML等),提供了一個JMX代理和所有可管理組件的視圖。
3)分布管理信息,以便構造一個分散式系統,也就是將高層管理平台的管理信息向其下眾多的JMX代理髮布。
4)收集多個JMX 代理端的管理信息並根據管理終端用戶的需要篩選用戶感興趣的信息並形成邏輯視圖送給相應的終端用戶。
5)提供了安全保證。
通過管理套用層和另一管理代理和以及他的設備層的聯合,就可以為我們提供一個完整的網路管理的解決方案。這個解決方案為我們帶來了獨一無二的一些優點:輕便、根據需要部署、動態服務、還有安全性。
管理協定
該層提供了一些API來支持當前已經存在的一些管理協定。
這些附加的協定API並沒有定義管理套用的功能,或者管理平台的體系結構,他們僅僅定義了標準的Java API和現存的網路管理技術通信,例如SNMP。
網路管理平台和套用的開發者可以用這些API來和他們的管理環境進行互動,並將這個互動過程封裝在一個JMX管理資源中。例如,通過SNMP可以對一個運行有SNMP代理的交換機進行管理,並將這些管理接口封裝成為一個管理構件。在動態網路管理中,可以隨時更換這些管理構件以適應需求。
這些API可以幫組開發者根據最通常的工業標準來部署他們的管理平台和套用。新的網路管理的解決方案可以和現存的基礎結構合為一體,這樣,現存的網路管理也能很好的利用基於Java技術的網路管理套用。
這些API目前在JCP(Java Community Process)內作為獨立的JSR(Java Specification Request)開發。
他們包括:
1)SNMP Manager API
2)CIM/WBEM manager and protocol API
實現套用
自從SUN發布了JMX規範,許多大公司紛紛行動起來,實現規範或者實現相應的基於JMX的網路管理系統,下面列出了當前的主要實現及套用情況:
1)SUN為JMX規範了作出了相應的參考實現,並在此基礎上開發了一個全新的用於網路管理的產品JDMK(Java動態管理工具集),其中定義了資源的開發過程和方法、動態JMX代理的實現、遠程管理套用的實現。同時,JDMK也提供了一個完整的體系結構用來構造分散式的網路管理系統,並提供了多種協定適配器和連線器,如SNMP協定適配器、HTML協定適配器、HTTP連線器、RMI連線器。
2)IBM Tivoli實現了JMX規範的產品為TivoliJMX,它為JAVA管理應用程式和網路提供了架構、設計模式、一些API集和一些服務。
3)Adventnet開發的關於JMX的產品為AdventNet Agent Toolkit,它使得定義新的SNMP MIB、開發JMX和Java SNMP Agent的過程自動化。
4)JBoss實現的J2EE套用伺服器以JMX為微核心,各個模組以管理構件的形式提供相應的服務。
5)BEA的Weblogic套用伺服器也將JMX技術作為自己的管理基礎。
6)金蝶的Apusic也是一個以JMX為核心開發出的J2EE套用伺服器。
架構
JMX應該說是關於網路套用管理的框架,如果你開發了一個比較複雜的系統,無疑你要提供這個系統的自身管理 系統,JMX更多套用是體現在Server上,如果你要使用java開發一個自己Server或複雜的套用系統,那么推薦你基於JMX架構來開發, JBoss 3.0 weblogic等就是基於JMX開發的符合J2EE規範的伺服器軟體。
了解JMX可以使你深入了解J2EE伺服器, 為什麼我們平時說 "EJB"是個比較"Weight"的方案選擇,其中一個原因是J2EE伺服器軟體本身 也是你的系統中一部分,它作為你系統的容器,對你的系統有至關重要的作用,如果無法直接介入 管理或“調教”它,那么無疑你的系統本身存在著隱含的危險, 現在,通過JMX,你現在可以深入到你J2EE容器內部的管理了。 (好像國內出現了第一個自己J2ee伺服器,不知道那是不是基於JMX開發的?)
J2EE並不能概括所有的套用領域,比如對速度和性能要求極高的遊戲或股票行情等系統就需要自己直接來開發Server, 如果是能夠基於JMX開發,那么可以說就大大提高編寫管理程式的效率,可以將你的模組變成JMX的MBean,可以通過Agent在程式內部或者通過 WEB管理頁面對你的MBean模組進行初始化 重啟 以及參數設定。
JMX的好處還有:可以方便整合連線現有的Java技術,如JNDI JDBC JTS及其它。特別是能夠使用Jini的查詢 發現機制以及協定,我們知道,Jini提供了一種服務的查詢和發現機制,這些services都可以通過JMX 來實現管理。
現在我們開始JMX的了解:
1.到java.sun首頁的JMX頁面,下載JMX的規定說明和Samples程式。
2.按照JMX的說明進行一次Tutorial,了解如何加入 刪除 配置一個MBean,Tutorial中是以SimpleMBean為例,那么我們能否建立一個自己的MBean?
我們來做一個Hello 的MBean,這裡有一個小關鍵點,你的class取名有個規則, 需要以MBean為結尾,如這裡我們取名為HelloMbean:
public interface HelloMBean {
// management attributes
public String getName();
public void setName(String name);
// management operations
public void print();
}
在這個Class里,有一個隱含attributes: name, 提供了set和get的方法,同時有一個操作方法print():
再定義一個concrete類:
public class Hello implements HelloMBean {
private String name = "";
public String getName() {
return name;
}
public void setName(String name) {
}
public void print() {
System.out.println("Hello, " + name + "!!" );
}
}
這樣一個簡單的MBean就做好了,我們可以通過admin界面加入這個Hello,
再按 Tutorial啟動BaseAgent,在Agent Administration中參考Simple填入:
Domain: Standard_Hello_MBeans
Keys : name=Hello,number=1
Java Class: Hello
將出現Create Successful信息。進入MBean View 給Name賦值,點按Apply ,然後再按print,這是你的Hello中的方法,在控制台你會看到輸出。
是不是很驚奇Hello中的 attributes 和operations能被動態的訪問和控制? 已經隱約感到JMX的架構原理了吧?
下面再深入明確一些概念:
上面HelloMBean資源是通過admin這樣的HTTP WEB界面管理,這種管理資源方式是屬於JMX的Distributed服務層, JMX 通過Distributed層能夠部署和管理MBean資源。就象上面的例子,是通過HtmlAdaptor提供的HTTP WEB界面來方面的維護管理HelloMBean.
那么我們能否在程式中自動管理和部署我的MBean?當然可以,這是通過Agent層來完成,現在我們已經有了這個層次,MBean所在的資源層,
最外面的Distributed服務層,Distributed服務層是通過Agent層來訪問MBean資源的。
Agent Level(Agent層)包括MBean Server和Agent Services,那么我們來做一個上面例子HelloMBean的Agent:
// CREATE the MBeanServer
//
System.out.println("\n\tCREATE the MBeanServer.");
MBeanServer server = MBeanServerFactory.createMBeanServer();
// CREATE Registe HelloMBean
//
System.out.println("\n\tCREATE, REGISTER a new Hello Standard_MBean:");
HelloMBean helloMBean = new Hello();
ObjectName hello_name = null;
try {
hello_name = new ObjectName("Standard_Hello_MBeans:name=Hello,number=1");
System.out.println("\tOBJECT NAME = " + hello_name);
//將HelloMBean註冊到MBeanServer中去
server.registerMBean(helloMBean, hello_name);
}
catch (Exception e) {
e.printStackTrace();
return;
}
向MBeanServer註冊後,以後JMX就知道有了這個HelloMBean資源。
管理一個agent的MBean資源或使用它提供的服務必須通過一個protocol adaptor 或者connector,adaptor 或者connector屬於Distributed layer level(Distributed服務層),我們上面例子中通過HTTP WEB界面管理HelloMBean就是瀏覽器通過HtmlAdaptor這個adaptor來實現的。