Java Management Extensions (JMX) 提供標準化的管理與監控介面。本文透過一個最簡單的 Standard MBean 範例,示範如何註冊 MBean、操作屬性與方法,並啟動 HTML Adaptor 在瀏覽器中進行遠端管理。
範例包含三個核心類別:
State 與操作 startService()。StandBeanMBean.javapublic interface StandBeanMBean {
public String getState();
public void setState(String s);
public void startService();
}
StandBean.javapublic class StandBean implements StandBeanMBean {
private String state = "init value";
public String getState() { return state; }
public void setState(String s) { state = s; }
public void startService() {
System.out.println("My service start.....");
}
}
StardBeanDemoMain.javaimport javax.management.*;
import javax.management.remote.*;
import com.sun.jdmk.comm.HtmlAdaptorServer;
public class StardBeanDemoMain {
private MBeanServer mBserver = null;
private ObjectName mbeanObjectName = null;
private String domain = null;
private String mbeanName = "StandBean";
public static void main(String[] args) {
StardBeanDemoMain sbean = new StardBeanDemoMain();
sbean.doRegistBean(); // 1. 建立 MBeanServer 並註冊 MBean
sbean.doManageBean(); // 2. 示範屬性讀寫與方法呼叫
sbean.regHtmlAdaptor(); // 3. 註冊 HTML Adaptor (port 8082)
}
/** 建立 MBeanServer 並註冊 MBean */
private void doRegistBean() {
try {
mBserver = MBeanServerFactory.createMBeanServer();
domain = mBserver.getDefaultDomain();
mbeanObjectName = new ObjectName(domain + ":type=" + mbeanName);
StandBean bean = new StandBean();
mBserver.registerMBean(bean, mbeanObjectName);
System.out.println("register StandMbean sucess..");
} catch (Exception e) {
e.printStackTrace(); System.exit(1);
}
}
/** 示範透過 MBeanServer 管理 MBean */
private void doManageBean() {
try {
ObjectName name = new ObjectName(domain + ":type=" + mbeanName);
// 讀取屬性
System.out.println("Attribute:state -" + mBserver.getAttribute(name, "State"));
// 修改屬性
Attribute attr = new Attribute("State", "new state");
mBserver.setAttribute(name, attr);
System.out.println("Attribute:state 2 -" + mBserver.getAttribute(name, "State"));
// 呼叫方法
mBserver.invoke(name, "startService", null, null);
} catch (Exception e) { e.printStackTrace(); }
}
/** 註冊 HTML Adaptor,提供瀏覽器管理介面 */
private void regHtmlAdaptor() {
HtmlAdaptorServer html = new HtmlAdaptorServer();
try {
ObjectName htmlName = new ObjectName("Adaptor:name=html,port=8082");
mBserver.registerMBean(html, htmlName);
html.start(); // 啟動 HTTP 服務
System.out.println("HTML Adaptor started on port 8082");
} catch (Exception e) {
System.out.println("\t!!! Could not create the HTML adaptor !!!");
e.printStackTrace();
}
}
}
jdmkrt.jar (Sun JMX 參考實作附帶的 HTML Adaptor)。StardBeanDemoMain,Console 輸出:register StandMbean sucess..
Attribute:state -init value
Attribute:state 2 -new state
My service start.....
HTML Adaptor started on port 8082
https://localhost:8082,即可看到 JMX HTML Adaptor 管理介面。domain:type=StandBean,點擊進入。startService 按鈕,Console 再次印出 My service start.....,證明遠端呼叫成功。MBean 後綴。MBeanServerFactory.createMBeanServer() 取得預設 MBeanServer。ObjectName 格式:domain:key=value[,key=value]*,唯一識別一個 MBean。進階主題包括:Dynamic MBean、Model MBean、Open MBean、Notification 機制、JMX Remote API (JSR 160) 等。