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. 爲了運行這是個例子, 須要按照以下幾步執行: