jmx全稱是Java Management Extensions 是java的一種擴(kuò)展管理工具指巡,可以通過(guò)網(wǎng)頁(yè)或者客戶端的方式管理正在運(yùn)行的java服務(wù)盛撑,例如Tomcat的容器停止或者重啟噪猾。Tomcat基于jmx開發(fā)的阻塑,Jboss也是類似的客们,數(shù)據(jù)庫(kù)連接池druid也有同樣的功能歉眷。擁有jmx意味著可以通過(guò)在頁(yè)面上動(dòng)態(tài)調(diào)整服務(wù)牺六。如下圖jmx架構(gòu)圖
由上面的圖片可以看出mbean分為三層,分別是基礎(chǔ)層汗捡、代理層淑际,遠(yuǎn)程管理層
- 基礎(chǔ)層mbean,分為了標(biāo)準(zhǔn)Mbean扇住、動(dòng)態(tài)Mbean春缕、mxbean等
- 代理層(適配層)提供對(duì)mbean的管理
- 遠(yuǎn)程管理層 可以通過(guò)http、snmp艘蹋、rmi等不同的協(xié)議去管理具體的mbean資源
StandardMBean
使用StandardMBean 必須為每一個(gè)MBean定義一個(gè)接口锄贼,而且名字限定為xxxMBean
// 接口
public interface DemoMBean {
public String getName();
public int getAge();
public void setName(String name);
public void setAge(int age);
void init();
}
// 具體實(shí)現(xiàn)
public class Demo implements DemoMBean {
private String name;
private int age;
@Override
public String getName() {
return name;
}
@Override
public int getAge() {
return age;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public void init() {
this.age = 10;
this.name = "hehehehehe";
}
}
// agent
public class DemoAgent {
public static void main(String[] args) {
try {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
String domainName = "DemoMBean";
// 為MBean(下面的new Hello())創(chuàng)建ObjectName實(shí)例
ObjectName demo = new ObjectName(domainName + ":name=Demo");
// 將demo對(duì)象注冊(cè)到MBeanServer上去
server.registerMBean(new Demo(), demo);
Thread.sleep(60*60*1000);
// demo而已,便于測(cè)試女阀,加上了這個(gè)線程睡眠
} catch (Exception e){
e.printStackTrace();
}
}
}
// 系統(tǒng)默認(rèn)的賦值
// 觸發(fā)init方法
// 觸發(fā)init函數(shù)宅荤,運(yùn)行完值已經(jīng)發(fā)生變化了
這樣我們就可以在本地通過(guò)jconsole動(dòng)態(tài)修改了服務(wù)內(nèi)的數(shù)據(jù),在實(shí)際發(fā)開中浸策,存在修改線上配置文件的屬性冯键,除了重新部署修改之外,也可以通過(guò)類似的方案實(shí)現(xiàn)庸汗。
除了本地jconsole工具管理mbean惫确,還可以通過(guò)rmi、http等方式管理,原理也類似雕薪,遵循jmx的使用協(xié)議昧诱,在原本寫好的agent上再包裝一層提供給外界使用。