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

          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接口
          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:測(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 

                對(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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 崇礼县| 遵义县| 海安县| 班戈县| 天峨县| 定远县| 华阴市| 陇川县| 唐山市| 临沂市| 绵竹市| 昭觉县| 万源市| 宜兰县| 凤山市| 博野县| 荣昌县| 湟中县| 小金县| 平乐县| 桐柏县| 普兰店市| 荣昌县| 万州区| 平遥县| 丹凤县| 汕尾市| 杨浦区| 铅山县| 禄劝| 重庆市| 建宁县| 泗阳县| 沐川县| 麦盖提县| 桓台县| 沽源县| 津市市| 黎川县| 固始县| 渑池县|