这些 Java 教程是针对 JDK 8 编写的。本页面中描述的示例和实践不会利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅 Java 语言变更,了解 Java SE 9 及后续版本中更新的语言特性的摘要。
请参阅 JDK 发行说明,了解所有 JDK 发布版本的新功能、增强功能以及已移除或已废弃选项的信息。
JMX API定义了一种机制,使MBean能够生成通知,例如,用于表示状态更改、检测到的事件或问题。
要生成通知,一个MBean必须实现接口NotificationEmitter或扩展NotificationBroadcasterSupport。要发送通知,您需要构造一个javax.management.Notification类的实例或其子类(如AttributeChangedNotification),并将实例传递给NotificationBroadcasterSupport.sendNotification。
每个通知都有一个源。源是生成通知的MBean的对象名称。
每个通知都有一个序列号。当顺序很重要且有可能处理通知时按错误顺序处理时,可以使用此号码来对来自相同源的通知进行排序。序列号可以为零,但最好对来自给定MBean的每个通知递增。
Hello MBean实现在标准MBeans中实际上实现了通知机制。然而,出于简单起见,该课程中省略了这段代码。完整的Hello代码如下:
package com.example;
import javax.management.*;
public class Hello
extends NotificationBroadcasterSupport
implements HelloMBean {
public void sayHello() {
System.out.println("你好,世界");
}
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("缓存大小现在是 " + this.cacheSize);
Notification n = new AttributeChangeNotification(this,
sequenceNumber++, System.currentTimeMillis(),
"缓存大小已更改", "缓存大小", "int",
oldSize, this.cacheSize);
sendNotification(n);
}
@Override
public MBeanNotificationInfo[] getNotificationInfo() {
String[] types = new String[]{
AttributeChangeNotification.ATTRIBUTE_CHANGE
};
String name = AttributeChangeNotification.class.getName();
String description = "此MBean的属性已更改";
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属性的值。
通知是由JMX类AttributeChangeNotification的实例n构造的,该类继承自javax.management.Notification。通知在setCacheSize()方法的定义中构造,构造时使用以下信息作为参数传递给AttributeChangeNotification。
Hello MBean,由this表示sequenceNumber,设置为1并递增CacheSizeoldSizethis.cacheSize然后将通知n传递给NotificationBroadcasterSupport.sendNotification()方法。
最后,定义MBeanNotificationInfo实例来描述MBean生成的不同类型的通知实例的特性。在本例中,发送的通知类型是AttributeChangeNotification通知。
再次使用JConsole与Hello MBean交互,这次是用来发送和接收通知。此示例需要Java SE平台的6版本。
jmx_examples.zip保存到你的work_dir目录中。unzip jmx_examples.zip
work_dir目录中编译示例Java类。
javac com/example/*.java
Main应用程序。
java com.example.Main
会生成一个提示,表示Main正在等待某些操作。
jconsole
会显示一个新的连接对话框,其中列出了可以连接的正在运行的JMX代理。
com.example.Main,然后点击连接。
会显示当前平台活动的摘要。
该面板显示了当前在MBean服务器中注册的所有MBean。
com.example节点。
你会看到由Hello创建并注册的示例MBean。如果你点击Hello,你会在MBean树中看到它的通知节点。
Hello MBean的通知节点。
请注意面板是空白的。
通知节点标签中显示接收到的通知数(0)。
Hello MBean的属性节点,并将CacheSize属性的值更改为150。
在你启动Main的终端窗口中,会显示此属性更改的确认信息。请注意,通知节点中显示的接收到的通知数已经变为1。
Hello MBean的通知节点。
会显示通知的详细信息。