參考:http://tuhaitao.iteye.com/blog/786391
這里以MBean對象進行演示向服務器注冊,調用的過程。
1.MBean接口,接口名必須以MBean結尾
1 package gofAndJavaSourceStudy.jmxstudy.jmxImpl; 2 3 public interface HelloMBean { 4 //管理屬性 5 public void setName(String name); 6 7 public String getName(); 8 9 //管理操作 10 public String print(); 11 }
2.實現這個接口,定義屬性和行為
1 package gofAndJavaSourceStudy.jmxstudy.jmxImpl; 2 3 import java.lang.management.ManagementFactory; 4 5 import javax.management.Attribute; 6 import javax.management.MBeanServer; 7 import javax.management.ObjectName; 8 9 //MBean的接口和實現類必須位於同一個包中 10 11 public class Hello implements HelloMBean { 12 public String name; 13 14 public void setName(String name) { 15 // TODO Auto-generated method stub 16 this.name = name; 17 } 18 19 public String getName() { 20 // TODO Auto-generated method stub 21 return name; 22 } 23 24 public String print() { 25 // TODO Auto-generated method stub 26 String result = "Hello," + name + "!!"; 27 System.out.println(result); 28 return result; 29 } 30 31 public static void main(String args[]) throws Exception { 32 MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); // 獲取MBeanServer 33 ObjectName name = new ObjectName("fjs:type=hello"); // 構造一個名字 34 Hello hello = new Hello(); // 創建需要注冊的對象 35 mbs.registerMBean(hello, name); // 注冊這個對象 36 37 mbs.setAttribute(name, new Attribute("Name", "bianjie")); //屬性首字母必須大寫 38 mbs.invoke(name, "print", null, null); //第三個參數為Object[],為傳入的參數值,第四個參數為String[],指明參數類型 39 Thread.sleep(Long.MAX_VALUE); 40 } 41 42 }
main方法中演示了申請服務器,向服務器注冊MBean以及調用的過程。通過objectname,我們可以獲得對象的屬性,傳參調用方法等等。
幾個需要注意的點:1.MBean接口和實現類必須位於同一包下2.Thread.sleep()必須有,阻塞線程,否則服務器和對象的生命周期都結束了,也就無管理可言了。所以運用在監控服務器上的應用程序。
3.幾個工具
oracle java mission control :可以連接虛擬機,並監控虛擬機的各項指標狀態,遠程管理應用。今后可以深入研究,應該對性能測試,虛擬機調優作用非常大
簡單調用了一下上面注冊的MBean
---------------------------
二.關於JMX與JNDI的比較,參考:http://www.bitscn.com/pdb/java/200805/141680.html
操作對象:JMX和JNDI都可以對Java類和對象進行查找和定位(JMX中還支持對MBean的查找,並有特定的Query類)。但是在實際應用中,JMX一般用於系統重要的功能性組件;JNDI用來查找部署在服務器中的各個應用程序中的資源,例如servlet、EJB和POJO等,並會為每個應用程序建立獨立的隔離的Context.各個Context中,只能定位在這個Context中的資源。