Lesson: Notifications
JMX API定义了一个机制去让MBeans生成通知,例如:状态变化的信号,检测事件或者问题。
为了生成通知,MBean必须实现NotificationEmitter接口或者扩展NotificationBroadcasterSupport类。为了发送一个通知,你需要构造一个 javax.management.Notification或者它子类(AttributeChangedNotification)的实例, 然后把这个实例传递给NotificationBroadcasterSupport.sendNotification。
每一个通知都有源(source)。源是生成通知的MBean对象名字。
每一个通知都有一个序列号。这个号码可以用于给来自同一个源的通知排序。如果不是正确的顺序可能导致一个错误。这个序列号可以是0但最好来自于同一个MBean的通知是自增的。
Hello MBean实现了标准的MBeans,实际上也实现了这个机制。但是,为了简单,这段代码被省略了。完整的Hello代码是:
这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 然后退出。
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 然后退出。