JMX分析2-Monitor
JMX Monitor主要用于監(jiān)控MBeanServer注冊(cè)的MBeans屬性值得變化,在屬性的值達(dá)到閾值的時(shí)候發(fā)送消息。JMX agent需要實(shí)現(xiàn)Monitor功能。
下面看一下例子:
代碼1:標(biāo)準(zhǔn)MBean接口
代碼2:標(biāo)準(zhǔn)MBean的實(shí)現(xiàn)類
代碼3:測(cè)試類
對(duì)MBean進(jìn)行監(jiān)控,基本有以下幾個(gè)步驟
1 注冊(cè)被監(jiān)控的MBean
2 實(shí)例化一個(gè)Monitor,如monitor。
3 monitor里添加被監(jiān)控類,即關(guān)聯(lián)起監(jiān)控類和被監(jiān)控類(調(diào)用monitor.addObservedObject(MBean))。
4 monitor設(shè)置相關(guān)屬性,如監(jiān)控間隔時(shí)間(setGranularityPeriod(...))、監(jiān)控的屬性(即被監(jiān)控MBean的一個(gè)屬性,setObservedAttribute(...),比如例子中的屬性"Count",監(jiān)控會(huì)取得這個(gè)值,跟其他屬性對(duì)比,達(dá)到了閾值,則觸發(fā)事件),其他Monitor實(shí)現(xiàn)類的相關(guān)屬性。
5 啟動(dòng)監(jiān)控(m.start())。
圖:MonitorMBean的層次圖

看下Monitor中主要類:
MonitorMBean
定義了一個(gè)JMX監(jiān)控的開始、結(jié)束、加入監(jiān)控的MBean、設(shè)置監(jiān)控的間隔等
圖:MonitorMBean接口

Monitor、CountMonitor、GaugeMonitor、StringMonitor
從MonitorMBean的層次圖中看出,Monitor實(shí)現(xiàn)了MonitorMBean,Monitor作為一個(gè)抽象類,實(shí)現(xiàn)了大部分功能,包括監(jiān)控的啟動(dòng)、結(jié)束、任務(wù)調(diào)度,監(jiān)控的邏輯等。而XXXMonitor作為子類,實(shí)現(xiàn)Monitor中的特定方法,即采用了模板方法模式。
參考:
http://docs.oracle.com/javase/7/docs/technotes/guides/jmx/JMX_1_4_specification.pdf (JMX規(guī)范說(shuō)明)
下面看一下例子:
代碼1:標(biāo)準(zhǔn)MBean接口
1 package test.jmx.monitor;
2
3 public interface CountMBean {
4 public int getCount();
5 }
2
3 public interface CountMBean {
4 public int getCount();
5 }
代碼2:標(biāo)準(zhǔn)MBean的實(shí)現(xiàn)類
1 package test.jmx.monitor;
2
3 public class Count implements CountMBean{
4 int count = 0;
5
6 Count(int count){
7 this.count = count;
8 }
9
10 @Override
11 public int getCount() {
12 return count;
13 }
14
15 public void addNumber(){
16 count = count + 3;
17 }
18 }
19
2
3 public class Count implements CountMBean{
4 int count = 0;
5
6 Count(int count){
7 this.count = count;
8 }
9
10 @Override
11 public int getCount() {
12 return count;
13 }
14
15 public void addNumber(){
16 count = count + 3;
17 }
18 }
19
代碼3:測(cè)試類
1 package test.jmx.monitor;
2
3 import javax.management.MBeanServer;
4 import javax.management.MBeanServerFactory;
5 import javax.management.MalformedObjectNameException;
6 import javax.management.Notification;
7 import javax.management.NotificationListener;
8 import javax.management.ObjectName;
9 import javax.management.monitor.CounterMonitor;
10 import javax.management.monitor.Monitor;
11 import javax.management.monitor.MonitorNotification;
12
13 import org.junit.Test;
14
15 public class MonitorTest {
16
17 @Test
18 public void test1CountMonitor() throws Exception{
19 MBeanServer ms = MBeanServerFactory.createMBeanServer();
20
21 final Count count = new Count(0);
22 final ObjectName nameCount = new ObjectName("Count:type=StandardMBean");
23 ms.registerMBean(count, nameCount);
24
25 //這個(gè)監(jiān)聽器類主要用于監(jiān)聽一個(gè)對(duì)象的屬性(數(shù)值類型)
26 CounterMonitor cMonitor = new CounterMonitor();
27 //被監(jiān)聽的對(duì)象
28 cMonitor.addObservedObject(nameCount);
29 //被監(jiān)聽者的屬性
30 cMonitor.setObservedAttribute("Count");
31 //閾值為3,超過的話,觸發(fā)事件
32 cMonitor.setInitThreshold(4);
33 //間隔時(shí)間
34 cMonitor.setGranularityPeriod(1000);
35 //接受監(jiān)控的事件
36 cMonitor.setNotify(true);
37 //監(jiān)控期間沒發(fā)現(xiàn)超過一次閾值,那么閾值偏移值往上加 threshold = threshold+offset;
38 cMonitor.setOffset(4);
39 //注冊(cè)一個(gè)Lister,用來(lái)監(jiān)聽Monitor所產(chǎn)生的消息(事件)
40 cMonitor.addNotificationListener(new NotificationListener() {
41 @Override
42 public void handleNotification(Notification notification, Object handback) {
43 MonitorNotification n = (MonitorNotification)notification;
44 CounterMonitor monitor = (CounterMonitor)n.getSource();
45 if(MonitorNotification.THRESHOLD_VALUE_EXCEEDED.equals(n.getType())){
46 System.out.println("Count類-"+monitor.getObservedAttribute()+"屬性:"+n.getDerivedGauge()
47 +">=了設(shè)定的閾值:"+n.getTrigger()+";下個(gè)閾值:"+monitor.getThreshold(nameCount));
48 }else{
49 System.out.println(n.getType()+"--"+n);
50 }
51 }
52 },null,null);
53
54 //Monitor本身就是一個(gè)標(biāo)準(zhǔn)MBean,而且Monitor也必須被注冊(cè)到MBeanServer中
55 ObjectName nameMonitor = new ObjectName("CountMonitor:type=Monitor");
56 ms.registerMBean(cMonitor, nameMonitor);
57 //開始監(jiān)控
58 cMonitor.start();
59
60 for(int i=0;i<5;i++){
61 count.addNumber();
62 Thread.sleep(2000);
63 }
64 Thread.sleep(5000);;
65 }
66
67 }
68
2
3 import javax.management.MBeanServer;
4 import javax.management.MBeanServerFactory;
5 import javax.management.MalformedObjectNameException;
6 import javax.management.Notification;
7 import javax.management.NotificationListener;
8 import javax.management.ObjectName;
9 import javax.management.monitor.CounterMonitor;
10 import javax.management.monitor.Monitor;
11 import javax.management.monitor.MonitorNotification;
12
13 import org.junit.Test;
14
15 public class MonitorTest {
16
17 @Test
18 public void test1CountMonitor() throws Exception{
19 MBeanServer ms = MBeanServerFactory.createMBeanServer();
20
21 final Count count = new Count(0);
22 final ObjectName nameCount = new ObjectName("Count:type=StandardMBean");
23 ms.registerMBean(count, nameCount);
24
25 //這個(gè)監(jiān)聽器類主要用于監(jiān)聽一個(gè)對(duì)象的屬性(數(shù)值類型)
26 CounterMonitor cMonitor = new CounterMonitor();
27 //被監(jiān)聽的對(duì)象
28 cMonitor.addObservedObject(nameCount);
29 //被監(jiān)聽者的屬性
30 cMonitor.setObservedAttribute("Count");
31 //閾值為3,超過的話,觸發(fā)事件
32 cMonitor.setInitThreshold(4);
33 //間隔時(shí)間
34 cMonitor.setGranularityPeriod(1000);
35 //接受監(jiān)控的事件
36 cMonitor.setNotify(true);
37 //監(jiān)控期間沒發(fā)現(xiàn)超過一次閾值,那么閾值偏移值往上加 threshold = threshold+offset;
38 cMonitor.setOffset(4);
39 //注冊(cè)一個(gè)Lister,用來(lái)監(jiān)聽Monitor所產(chǎn)生的消息(事件)
40 cMonitor.addNotificationListener(new NotificationListener() {
41 @Override
42 public void handleNotification(Notification notification, Object handback) {
43 MonitorNotification n = (MonitorNotification)notification;
44 CounterMonitor monitor = (CounterMonitor)n.getSource();
45 if(MonitorNotification.THRESHOLD_VALUE_EXCEEDED.equals(n.getType())){
46 System.out.println("Count類-"+monitor.getObservedAttribute()+"屬性:"+n.getDerivedGauge()
47 +">=了設(shè)定的閾值:"+n.getTrigger()+";下個(gè)閾值:"+monitor.getThreshold(nameCount));
48 }else{
49 System.out.println(n.getType()+"--"+n);
50 }
51 }
52 },null,null);
53
54 //Monitor本身就是一個(gè)標(biāo)準(zhǔn)MBean,而且Monitor也必須被注冊(cè)到MBeanServer中
55 ObjectName nameMonitor = new ObjectName("CountMonitor:type=Monitor");
56 ms.registerMBean(cMonitor, nameMonitor);
57 //開始監(jiān)控
58 cMonitor.start();
59
60 for(int i=0;i<5;i++){
61 count.addNumber();
62 Thread.sleep(2000);
63 }
64 Thread.sleep(5000);;
65 }
66
67 }
68
對(duì)MBean進(jìn)行監(jiān)控,基本有以下幾個(gè)步驟
1 注冊(cè)被監(jiān)控的MBean
2 實(shí)例化一個(gè)Monitor,如monitor。
3 monitor里添加被監(jiān)控類,即關(guān)聯(lián)起監(jiān)控類和被監(jiān)控類(調(diào)用monitor.addObservedObject(MBean))。
4 monitor設(shè)置相關(guān)屬性,如監(jiān)控間隔時(shí)間(setGranularityPeriod(...))、監(jiān)控的屬性(即被監(jiān)控MBean的一個(gè)屬性,setObservedAttribute(...),比如例子中的屬性"Count",監(jiān)控會(huì)取得這個(gè)值,跟其他屬性對(duì)比,達(dá)到了閾值,則觸發(fā)事件),其他Monitor實(shí)現(xiàn)類的相關(guān)屬性。
5 啟動(dòng)監(jiān)控(m.start())。
圖:MonitorMBean的層次圖

看下Monitor中主要類:
MonitorMBean
定義了一個(gè)JMX監(jiān)控的開始、結(jié)束、加入監(jiān)控的MBean、設(shè)置監(jiān)控的間隔等
圖:MonitorMBean接口

Monitor、CountMonitor、GaugeMonitor、StringMonitor
從MonitorMBean的層次圖中看出,Monitor實(shí)現(xiàn)了MonitorMBean,Monitor作為一個(gè)抽象類,實(shí)現(xiàn)了大部分功能,包括監(jiān)控的啟動(dòng)、結(jié)束、任務(wù)調(diào)度,監(jiān)控的邏輯等。而XXXMonitor作為子類,實(shí)現(xiàn)Monitor中的特定方法,即采用了模板方法模式。
參考:
http://docs.oracle.com/javase/7/docs/technotes/guides/jmx/JMX_1_4_specification.pdf (JMX規(guī)范說(shuō)明)
posted on 2012-10-17 00:04 heavensay 閱讀(944) 評(píng)論(0) 編輯 收藏 所屬分類: JMX