JMX掃盲(一)

JMX 是什麼, 爲何須要它, 做用是啥? JMX(Java Management Extension) 使用它能夠查看、操做應用的運行時狀態。JMX在概念上相似於SNMP。。。若是應用沒有任何其餘的用戶接口, 而且只能經過寫日誌文件來監控應用, 那麼監控和了解服務器類型應用必不可少。。。。基本的方式是建立一個接口, 用來操做你想要監控的東西, 而後有一個類實現接口, 而後用"MBeanServer"註冊該實現類的實例, 這個MBeanServer實際上使得定義在接口的東西可用來JMX監控apps , 好比使用jconsole 來監控系統。一言以蔽之, 用來監控和管理java平臺的應用。java

標準MBeans 這一部分會用一個例子直觀地說明標準MBean. 標準的MBean經過寫java 接口定義, 暫且叫作SomethingMBean還有個實現接口的java 類 Something。 接口中的每一個方法在MBean中定義了一個屬性或者一個操做。默認, 每一個方法定義一個操做。 屬性和操做是遵循特定設計模式的方法。 一個標準的MBean由一個MBean和一個實現MBean的class組成。 MBean接口列出了全部方法來暴露屬性和操做。 類實現了這個接口而且提供了基礎資源的功能。 下面的部分會展現一個Standard MBean的栗子, 而且還有一個簡單的管理JMX的JMX技術代理。設計模式

MBean 接口服務器

public interface HelloMBean { void sayHello(); int add(int x, int y); String getName(); int getCacheSize(); void setCacheSize(); }app

按照慣例, 一個MBean接口的名字由接口實現類+MBean組成, 在上面的例子中,接口HelloMBean 的實現類爲Hello. 按照JMX 規範, 一個MBean接口由可讀或者可寫的屬性和操做組成, 組成部分中的操做能夠被由MBean管理的應用調用。 上個例子中, HelloMBean聲明瞭2個操做: add(int x, int y); 、 sayHello();工具

HelloMBean 聲明瞭2個屬性: Name是Sring類型的只讀屬性, CacheSize是一個可讀可寫的int類型的屬性。 getter, setter方法被聲明用於容許可管理的應用存取、改變屬性值。 按照JMX的定義, getter方法可使manager 讀取屬性的值,屬性類型就是返回值類型。setter方法是任意的公共方法,它會使用一個單獨參數而且它的名字以set爲前綴。 setter方法可以使一個manager改變一個屬性的狀態, 屬性類型與setter中的參數類型相同。this

接口 HelloMBean 的實現類:線程

public class Hello implements HelloMBean { public void sayHello() { System.out.println("hello, world"); }設計

public int add(int x, int y) { 
    return x + y; 
} 
 
public String getName() { 
    return this.name; 
}  
 
public int getCacheSize() { 
    return this.cacheSize; 
} 
 
public synchronized void setCacheSize(int size) {
    ...

    this.cacheSize = size; 
    System.out.println("Cache size now " + this.cacheSize); 
} 
...
 
private final String name = "Reginald"; 
private int cacheSize = DEFAULT_CACHE_SIZE; 
private static final int DEFAULT_CACHE_SIZE = 200;

}代理

Hello 類實現了了HelloMBean中對於操做和屬性的定義。固然 sayHello() 和 add() 操做實現很簡單, 可是真實的操做也是根據需求簡單或者複雜。日誌

用上面定義的Hello 和接口HelloMBean, 他們能夠被用於管理接口包含的資源, 以下:

建立一個JMX代理來管理一個資源

一旦資源被MBeans管理, 資源管理會被JMX代理執行。

一個JMX代理的核心的組件是MBean-Server. 一個MBean Server 是一個被管理的對象server,MBeans會被註冊到MBean-server中。 一個JMX代理也包含一組服務來管理MBeans. 能夠看看MBeanServer接口的API文檔, 瞭解MBean server 的實現細節。

The Main class that follows represents a basic JMX agent:

import java.lang.management.; import javax.management.;

public class Main { // JMX 代理

public static void main(String[] args) 
    throws Exception { 
 
    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();  // 從java API 中獲取MBeanServer實例
    ObjectName name = new ObjectName("com.example:type=Hello"); // 建立一個ObjectName對象
    Hello mbean = new Hello();  // 實例化自定義的 MBean -> Hello
    mbs.registerMBean(mbean, name); // 向MBeanServer中註冊已實例化的MBean: <MBean --register--> MBeanServer>
    System.out.println("Waiting forever...");  // 準備掛起當前主線程
    Thread.sleep(Long.MAX_VALUE);  // 主線程睡覺
}

} The MBeanServer instance obtained by Main is named mbs. JMX 代理經過獲取MBean server開啓, 調用了ManagementFactory.getPlatformMBeanServer();若是MBean server尚未被java平臺建立,那麼 getPlatformMBeanServer() 會經過調用JMX方法:MBeanServerFactory.createMBeanServer() 自動建立一個MBean server。 獲得的MBeanServer用mbs引用之。

下一步, 爲MBean實例定義一個對象名稱。每一個JMX MBean 必須有一個OBJECT NAME。對象名稱是JMX 類對象的名稱 而且必須服從由JMX規範定義的語法。 object name 不需包含一個域和key-value對列表。 在上述例子裏, 域是com.example 即爲包名。另外, key-value 對聲明這個對象是Hello 類型的。

一個Hello 的實例,被建立。Hello實例做爲MBean實例用object name 被註冊到MBeanServer中: MBeanServer.registerMBean().

在Hello MBean被註冊到MBeanServer後, 僅僅等待管理操做被執行。 在這個例子裏, 這些管理操做就是調用sayHello() 和 add(), 還有獲得和設置屬性值。

ok 都配置完成, 開始運行 Standard MBean 例子 運行Standard MBean須要用到工具: jconsole. 爲了運行這是個例子, 須要按照以下幾步執行:

  1. 打包樣例,並將其命名爲 jmx_examples.zip, 將它放到工做目錄;
  2. 解壓1步驟中的.zip文件, 命令: unzip jmx_examples.zip
  3. 編譯java 文件;
  4. 運行Main類;
  5. 開啓JConsole
  6. 鏈接表明Main的java 進程;
  7. 在jconsole中打開tab -> MBean: 左側列表是全部註冊到MBeanServer中的MBean實例
  8. 在MBean樹中, 打開com.example節點
  9. 展開Hello MBean的屬性節點,cacheSize屬性可讀可寫,name屬性只讀。
相關文章
相關標籤/搜索