javax.management

軟體包 javax.management 的描述 提供 Java Management Extensions 的核心類。 Java Management Extensions (JMXTM) API 是一個用於管理和監視的標準 API。典型用途包括: 查詢並更改應用程式配置 累積有關應用程式行為的統計並使其可用 通知狀態更改及錯誤狀況。 JMX API 還可以作為解決方案的一部分來管理系統、網路等。 API 包括遠程訪問,因此,遠程管理程式可以基於這些目的與正在運行的應用程式互動。

MBeans,伺服器,創建,通知,

MBeans

JMX API 的基本概念是 MBean。MBean 是表示資源的指定託管對象。它有一個管理接口,包括以下內容:
可以讀取和/或寫入的指定名稱和類型的屬性
可以調用的指定名稱和類型的操作
可以由 MBean 傳送的指定類型的通知。
例如,一個表示應用程式配置的 MBean 可以有一些表示不同配置項的屬性。讀取 CacheSize 屬性可以返回該項的當前值。寫入該屬性可以更新該項,從而可能會更改正在運行的應用程式的行為。諸如 save 之類的操作可以持久保存當前配置。每次更改配置時都會傳送 ConfigurationChangedNotification 之類的通知。
在 JMX API 的標準用法中,MBeans 可以像 Java 對象那樣來實現。不過,如下所述,通常不直接引用這些對象。
Standard MBean
為了使 MBean 實現簡單化,JMX API 包括Standard MBean 這一概念。Standard MBean 的屬性和操作來源於 Java 接口,使用特定的命名模式,與 JavaBeansTM 使用的屬性和操作類似。例如,假定有如下這個接口:
public interface ConfigurationMBean {
public int getCacheSize();
public void setCacheSize(int size);
public long getLastChangedTime();
public void save();
}
方法 getCacheSize 和 setCacheSize 定義了名為 CacheSize 的類型 int 的讀寫屬性(首字母大寫,這與 JavaBeans 慣例不同)。
方法 getLastChangedTime 定義了名為 LastChangedTime 的類型 long 的屬性。這是一種唯讀屬性,原因是沒有方法 setLastChangedTime。
方法 save 定義了名為 save 的操作。它不是屬性,原因是它的名稱沒有以 get、set 或 is 開頭。
Standard MBeans 的準確命名模式將在 JMX 規範中詳述。
製做作為帶有此管理接口的 MBean 的 Java 對象有兩種方法。一種用於具有與 Java 接口完全相同的名稱、但沒有 MBean 後綴的類的對象。因此,在該示例中,對象將是類 Configuration 的對象,與 ConfigurationMBean 在相同的 Java 包中。第二種方法是使用 StandardMBean 類。
Dynamic MBean
Dynamic MBean 是一種在運行時定義其管理接口的 MBean。例如,配置 MBean 可以通過解析 XML 檔案來確定它所公開的屬性名稱和類型。
任何實現 DynamicMBean 接口的類的 Java 對象都是 Dynamic MBean。
Open MBean
Open MBean 是一種 Dynamic MBean,在此屬性類型和操作參數類型以及返回值都使用一個預定義 Java 類的小集合來構建。Open MBean 使用其遠程管理程式加快了操作,這些遠程管理程式不必使用特定於應用程式的類型,其中包括非 Java 程式。Open MBean 由包 javax.management.openmbean 定義。
Model MBean
Model MBean 是一種 Dynamic MBean,它充當管理接口和基礎託管資源之間的橋樑。管理接口和託管資源都被指定為 Java 對象。相同的 Model MBean 實現可以重複多次用於不同的管理接口和託管資源,並且還可以提供諸如持久性和快取之類的共有功能。Model MBean 由包 javax.management.modelmbean 定義。

伺服器

要想讓 MBean 有用,必須在 MBean 伺服器中註冊它。MBean 伺服器是一個 MBean 存儲庫。通常情況下,只能通過 MBean 伺服器訪問 MBean。換句話說,代碼不再直接訪問實現 MBean 的 Java 對象,而是通過 MBean 伺服器根據名稱訪問該 MBean。每個 MBean 在 MBean 伺服器內都有一個由 ObjectName 類定義的惟一名稱。
MBean 伺服器是一個實現了接口 MBeanServer 的對象。從 J2SE 1.5 開始,將提供平台 MBean 伺服器。這是可以由在相同 Java 虛擬機內運行的不同託管組件共享的單個 MBean 伺服器。平台 MBean 伺服器可以通過方法 ManagementFactory.getPlatformMBeanServer() 訪問。
使用 MBeanServerFactory 類,應用程式代碼還可以創建一個新的 MBean 伺服器,或者訪問已經創建的 MBean 伺服器。

創建

創建 MBean 有兩種方法。一種方法是構造將作為 MBean 的 Java 對象,然後使用 registerMBean 方法將其在 MBean 伺服器註冊。另一種方法是使用其中一個 createMBean 方法在單一操作中創建並註冊 MBean。
registerMBean 方法對於本地使用較為簡單,但不能遠程使用。createMBean 方法可以遠程使用,但有時需要注意類載入問題。
如果實現了 MBeanRegistration 接口,則 MBean 可以在向 MBean 伺服器註冊或從中註銷時執行操作。
在 MBean 伺服器中訪問 MBean
給定一個 ObjectName name 和一個 MBeanServer mbs,便可以訪問一些屬性和操作,如此例:
int cacheSize = mbs.getAttribute(name, "CacheSize");
Attribute newCacheSize =
new Attribute("CacheSize", new Integer(2000));
mbs.setAttribute(name, newCacheSize);
mbs.invoke(name, "save", new Object[0], new Class[0]);
另外,如果您有一個與 MBean 管理接口對應的 Java 接口,則您可以使用 MBean 代理,如下所示:
ConfigurationMBean conf = (ConfigurationMBean)
MBeanServerInvocationHandler.newProxyInstance(mbs,
name,
ConfigurationMBean.class,
false);
int cacheSize = conf.getCacheSize();
conf.setCacheSize(2000);
conf.save();
使用 MBean 代理只是為了方便。與第一個示例相同,第二個示例的結尾同樣調用了 MBeanServer 操作。
可以通過查詢 MBean 伺服器查找其名稱與特定模式匹配和/或其屬性滿足特定約束的 MBean。名稱模式可以使用 ObjectName 類構造,而約束可以使用 Query 類構造。然後方法 queryNames 和 queryMBeans 將執行查詢。

通知

通知 是 Notification 類或子類的一個實例。除其 Java 類之外,它還有一個可以將它與相同類的其他通知區分開的類型 字元串。
一個將傳送通知的 MBean 必須實現 NotificationBroadcaster 或 NotificationEmitter 接口。通常情況下,它通過創建 NotificationBroadcasterSupport 子類或委派該類的一個實例來實現這一點。
通知可以由偵聽器 接收,該偵聽器是一個實現了 NotificationListener 接口的對象。可以使用方法 javax.management.MBeanServer#addNotificationListener(ObjectName、NotificationListener、NotificationFilter、Object) 將偵聽器添加到 MBean 中。可以選擇向此方法提供過濾器,以便只選擇感興趣的通知。過濾器是一個實現了 NotificationFilter 接口的對象。
MBean 可以是由同一個 MBean 伺服器中的其他 MBean 發出的通知的偵聽器。在此情況下,它實現 NotificationListener,並使用方法 javax.management.MBeanServer#addNotificationListener(ObjectName、ObjectName、NotificationFilter、Object) 來偵聽。
可以通過連線器 遠程訪問 Bean 伺服器。連線器允許遠程 Java 應用程式以實質上與本地 Java 應用程式相同的方式訪問 MBean 伺服器。包 javax.management.remote 定義連線器。
JMX 規範還定義了適配器 的概念。適配器可以在協定中(如 SNMP 或 HTML )的請求和對 MBean 伺服器的訪問之間進行轉換。所以,像 SNMP GET 這樣的操作可能會導致對 MBean 伺服器 getAttribute。
包規範
JMX API 規範,1.2 版
從以下版本開始:
1.5

相關詞條

熱門詞條

聯絡我們