子在川上曰

            逝者如斯夫不舍晝夜
          隨筆 - 71, 文章 - 0, 評論 - 915, 引用 - 0
          數據加載中……

          [JMX一步步來] 3、Notification的使用

          文/陳剛 from www.chengang.com.cn at 2005-12-4
           
          一、簡介
           
            Mbean之間的通信是必不可少的,Notification就起到了在Mbean之間溝通橋梁的作用。JMX notification 由四部分組成:
          • Notification 這個相當于一個信息包,封裝了需要傳遞的信息
          • Notification broadcaster 這相當于一個廣播器,把消息廣播出去
          • Notification listerner 這是一個監聽器,用于監聽廣播出來的Notification消息
          • Notification filter 這是一個過濾器,過濾掉不需要的Notification消息
            Notification broadcaster不需要我們實現,JMX的內部已經有了。Notification filter一般也很少用。下面的例子主要用到了Notification、Notification listerner。

          二、實例
           
            在第一篇的Hello中有一個printHello(String whoName)方法,意思根據碰到的是誰來打招呼,比如:
            
            Jack從對面走過來,說:“hi”
            我們回之以禮,說:“Hello, jack”
           
            首先這需要Jack先說一個hi(相應一個操作方法),然后他說的話封裝成聲波(相當Notification消息包)傳遞出去。然后我們還要給Jakc裝上一個監聽器(Hello的耳朵??^_^),這個監聽器將捕捉到Jack的聲波語音包,并進行相應處理,即說“Hello, jack”。
           
            好,我們看看如何實現的:
           
          1、Jack類及其相應的MBean
           
             我們把Jack寫成一個MBean,如下: 
          import javax.management.Notification;
          import javax.management.NotificationBroadcasterSupport;
          public class Jack extends NotificationBroadcasterSupport implements JackMBean {
              private int seq = 0;
              public void hi() {
                  Notification n = new Notification(//創建一個信息包
                          "jack.hi",//給這個Notification起個名稱
                          this, //由誰發出的Notification
                          ++seq,//一系列通知中的序列號,可以設任意數值
                          System.currentTimeMillis(),//發出時間
                          "Jack");//發出的消息文本
                  //發出去
                  sendNotification(n);
              }
          }
           
           說明:
          • 必需繼承NotificationBroadcasterSupport
          • 此類只有一個hi方法,方法只有兩句:創建一個Notification消息包,然后將包發出去
          • 如果你還要在消息包上附加其他數據,Notification還有一個setUserData方法可供使用
          2、接下來是他的MBean 
          public interface JackMBean {
              public void hi();
          }
           
          3、創建一個Listener,監聽到的Notification消息包將由此類負責處理。
           
          import javax.management.Notification;
          import javax.management.NotificationListener;
          public class HelloListener implements NotificationListener {
              public void handleNotification(Notification n, Object handback) {
                  System.out.println("type=" + n.getType());
                  System.out.println("source=" + n.getSource());
                  System.out.println("seq=" + n.getSequenceNumber());
                  System.out.println("send time=" + n.getTimeStamp());
                  System.out.println("message=" + n.getMessage());
                  if (handback != null) {
                      if (handback instanceof Hello) {
                          Hello hello = (Hello) handback;
                          hello.printHello(n.getMessage());
                      }
                  }
              }
          }
           
          4、修改HelloAgent如下(加上了紅色的三句):
          import javax.management.MBeanServer;
          import javax.management.MBeanServerFactory;
          import javax.management.ObjectName;
          import com.sun.jdmk.comm.HtmlAdaptorServer;
          public class HelloAgent {
              public static void main(String args[]) throws Exception{
                  MBeanServer server = MBeanServerFactory.createMBeanServer();
                  ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
                  Hello hello=new Hello();
                  server.registerMBean(hello, helloName);
                  ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
                  HtmlAdaptorServer adapter = new HtmlAdaptorServer();
                  server.registerMBean(adapter, adapterName);
                  Jack jack = new Jack();
                  server.registerMBean(jack, new ObjectName("HelloAgent:name=jack"));
                  jack.addNotificationListener(new HelloListener(), null, hello);
                  adapter.start();
                  System.out.println("start.....");
              }
          }
           
          三、運行 
          1、先運行HelloAgent啟動服務,再打開瀏覽器輸入網址:http://localhost:8082/,出現如下界面。1133701664014_6541.jpg
           
          2、 進入“name=jack”項,然后單擊“hi”按鈕來執行它。這時Eclipse的console視圖顯示如下:
           
          1133702044916_7117.jpg

          四、總結

            Notification和Java的事件模型是一樣的,另外如果你買了《Eclipse從入門到精通》,你會發現第22.4節也使用了和Notification和Java的事件模型相同的設計方式。Notification在我們的實際項目中也用到了,象我們現在的給移動做的項目中(基于JMX實現),分散在各地方的工作站的日志,就是通過Notification方式,把每條產生的日志封裝在Notification中實時發回主控服務器的。有機會我會發這一系統的關于日志的設計方案寫一下,它實現了對各地工作站的集中的、實時的監控,非常實用。

          作者簡介

          陳剛,廣西桂林人,著作有《Eclipse從入門到精通》
          您可以通過其博客了解更多信息和文章:http://www.chenGang.com.cn

          posted on 2006-03-07 15:01 陳剛 閱讀(6421) 評論(3)  編輯  收藏 所屬分類: JMX

          評論

          # re: [JMX一步步來] 3、Notification的使用  回復  更多評論   

          hi,你的文章挺好,就是圖片能不能看下,都不顯示
          2009-01-30 11:03 | piper

          # re: [JMX一步步來] 3、Notification的使用  回復  更多評論   

          謝謝,我看了你的jmx系列文章,學了很多東西,還會繼續關注
          2009-02-20 16:26 | mengyan

          # re: [JMX一步步來] 3、Notification的使用  回復  更多評論   

          然后我們還要給Jakc裝上一個監聽器(Hello的耳朵??^_^),這個監聽器將捕捉到Jack的聲波語音包,并進行相應處理,即說“Hello, jack”。


          為什么是給Jack裝上一個監聽器
          2012-11-30 16:49 | 特太太
          主站蜘蛛池模板: 蓝田县| 临高县| 龙南县| 福清市| 凉城县| 江川县| 盘锦市| 确山县| 扶余县| 马尔康县| 铁力市| 贵定县| 江口县| 天全县| 双江| 晋中市| 东乌珠穆沁旗| 灵璧县| 新河县| 万载县| 临漳县| 甘泉县| 日照市| 秦皇岛市| 盘锦市| 深水埗区| 黎平县| 泰来县| 永福县| 武夷山市| 扶风县| 沂水县| 嘉峪关市| 靖安县| 潼南县| 文山县| 南投市| 东海县| 柘荣县| 宁津县| 当阳市|