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 然後退出。