隨筆 - 12, 文章 - 0, 評論 - 22, 引用 - 0
          數(shù)據(jù)加載中……

          JMX分析2-Monitor

                JMX Monitor主要用于監(jiān)控MBeanServer注冊的MBeans屬性值得變化,在屬性的值達(dá)到閾值的時候發(fā)送消息。JMX agent需要實(shí)現(xiàn)Monitor功能。
          下面看一下例子:
          代碼1:標(biāo)準(zhǔn)MBean接口
          1 package test.jmx.monitor;
          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 

          代碼3:測試類
           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         //這個監(jiān)聽器類主要用于監(jiān)聽一個對象的屬性(數(shù)值類型)
          26         CounterMonitor cMonitor = new CounterMonitor();
          27         //被監(jiān)聽的對象
          28         cMonitor.addObservedObject(nameCount);
          29         //被監(jiān)聽者的屬性
          30         cMonitor.setObservedAttribute("Count");
          31         //閾值為3,超過的話,觸發(fā)事件
          32         cMonitor.setInitThreshold(4);
          33         //間隔時間
          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         //注冊一個Lister,用來監(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()+";下個閾值:"+monitor.getThreshold(nameCount));
          48                 }else{
          49                     System.out.println(n.getType()+"--"+n);
          50                 }
          51             }
          52         },null,null);
          53         
          54         //Monitor本身就是一個標(biāo)準(zhǔn)MBean,而且Monitor也必須被注冊到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 

                對MBean進(jìn)行監(jiān)控,基本有以下幾個步驟
          1 注冊被監(jiān)控的MBean
          2 實(shí)例化一個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)控間隔時間(setGranularityPeriod(...))、監(jiān)控的屬性(即被監(jiān)控MBean的一個屬性,setObservedAttribute(...),比如例子中的屬性"Count",監(jiān)控會取得這個值,跟其他屬性對比,達(dá)到了閾值,則觸發(fā)事件),其他Monitor實(shí)現(xiàn)類的相關(guān)屬性。
          5 啟動監(jiān)控(m.start())。

          圖:MonitorMBean的層次圖

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


          Monitor、CountMonitor、GaugeMonitor、StringMonitor
          MonitorMBean的層次圖中看出,Monitor實(shí)現(xiàn)了MonitorMBean,Monitor作為一個抽象類,實(shí)現(xiàn)了大部分功能,包括監(jiān)控的啟動、結(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ī)范說明)

          posted on 2012-10-17 00:04 heavensay 閱讀(952) 評論(0)  編輯  收藏 所屬分類: JMX


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 新绛县| 大悟县| 夏邑县| 木兰县| 定安县| 师宗县| 洛隆县| 日土县| 新宁县| 寿阳县| 苍梧县| 鲜城| 含山县| 湟源县| 平原县| 淳化县| 嘉义市| 福清市| 香格里拉县| 安丘市| 弥渡县| 六盘水市| 鹿泉市| 包头市| 黎城县| 健康| 宣威市| 镇远县| 商河县| 尚义县| 莆田市| 正定县| 海丰县| 闽清县| 晋城| 铜鼓县| 大名县| 即墨市| 河西区| 盐亭县| 元氏县|