三、JMX官方指導文檔 之 通知

Lesson: Notifications
JMX API定義了一個機制去讓MBeans生成通知,例如:狀態變化的信號,檢測事件或者問題。
爲了生成通知,MBean必須實現NotificationEmitter接口或者擴展NotificationBroadcasterSupport類。爲了發送一個通知,你需要構造一個 javax.management.Notification或者它子類(AttributeChangedNotification)的實例, 然後把這個實例傳遞給NotificationBroadcasterSupport.sendNotification。
每一個通知都有源(source)。源是生成通知的MBean對象名字。
每一個通知都有一個序列號。這個號碼可以用於給來自同一個源的通知排序。如果不是正確的順序可能導致一個錯誤。這個序列號可以是0但最好來自於同一個MBean的通知是自增的。
Hello MBean實現了標準的MBeans,實際上也實現了這個機制。但是,爲了簡單,這段代碼被省略了。完整的Hello代碼是:
       package com.example;


	import javax.management.*;


	public class Hello
	        extends NotificationBroadcasterSupport
	        implements HelloMBean {


	    public void sayHello() {
	        System.out.println("hello, world");
	    }


	    public int add(int x, int y) {
	        return x + y;
	    }


	    public String getName() {
	        return this.name;
	    }


	    public int getCacheSize() {
	        return this.cacheSize;
	    }


	    public synchronized void setCacheSize(int size) {
	        int oldSize = this.cacheSize;
	        this.cacheSize = size;


	        System.out.println("Cache size now " + this.cacheSize);


	        Notification n = new AttributeChangeNotification(this,
	                                sequenceNumber++, System.currentTimeMillis(),
	                                "CacheSize changed", "CacheSize", "int",
	                                oldSize, this.cacheSize);


	        sendNotification(n);
	    }


	    @Override
	    public MBeanNotificationInfo[] getNotificationInfo() {
	        String[] types = new String[]{
	            AttributeChangeNotification.ATTRIBUTE_CHANGE
	        };


	        String name = AttributeChangeNotification.class.getName();
	        String description = "An attribute of this MBean has changed";
	        MBeanNotificationInfo info = 
	                new MBeanNotificationInfo(types, name, description);
	        return new MBeanNotificationInfo[]{info};
	    }
	    
	    private final String name = "Reginald";
	    private int cacheSize = DEFAULT_CACHE_SIZE;
	    private static final int DEFAULT_CACHE_SIZE = 200;
	    private long sequenceNumber = 1;
	}



這Hello MBean擴展了NotificationBroadcasterSupport類。NotificationBroadcasterSupport實現了NotificationEmitter 接口。
標準MBean的屬性和操作和之前的一樣出來CacheSize 的setter方法現在定義了一個oldSize,用於記錄CacheSize之前設置的值。
  setCacheSize() 方法裏構造了一個AttributeChangeNotification實例,AttributeChangeNotification擴展了javax.management.Notification接口。AttributeChangeNotification 使用了下面的作爲參數:
  在Hello MBean裏this作爲通知的對象名。
  sequenceNumber被設置成1然後自增作爲通知的序列號。
  一個時間戳
  消息的內容
  改變的屬性的名字
  改變的屬性的類型
  老的值,這裏是oldSize
  新的值,這裏是this.cacheSize
  這個通知n被傳遞給 NotificationBroadcasterSupport.sendNotification()方法。
  最後, 定義了一個MBeanNotificationInfo實例描述MBean生成的通知的信息。在這個例子裏,是AttributeChangeNotification類型的通知。
  
  Running the MBean Notification Example
  再一次運行Hello MBean 然後使用JConsole和他交互,發送和接收消息。 這個例子需要JDk1.6及以後版本。
  1. 如果你已經還沒有寫好,保存 jmx_examples.zip到你的工作目錄。
  2. 解壓這個例子,在終端窗口中使用下面的命令。
  unzip jmx_examples.zip
  3. 在工作目錄中編譯這個例子。
  javac com/example/*.java
  4. 開始Main應用
  java com.example.Main
  5.在不同的終端窗口中開啓JConsole
  jconsole
  6.在這個連接窗口中選中com.example.Main然後連接他。
  一個當前平臺的概述就展示出來了
  7. 選擇MBeans標籤
  這個面板展示了當前註冊的MBeans。
  8. 在窗體的左邊,展開MBean樹的com.example節點。
  你可以看到這個例子的Hello MBean被註冊爲hello。如果你點擊hello,你可以看到MBean樹的Notifications節點。
  9. 展開Notifications節點。
  這個面板是空白的。
  10. 點擊訂閱按鈕。
  當前的o號通知將被接收到,然後展示在通知節點標籤。
  11. 展開Hello MBean的屬性節點,然後改變CacheSize屬性爲150
  在這個Main應用的窗體中,一個屬性改變信息被展示。這個接收到的通知的號碼也會變成1.
  12. 再展開Hello MBean的Notifications 節點。
  通知的詳細被人將被展示。
  13. 關閉JConsole 然後退出。
  























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章