这些 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并递增CacheSize
oldSize
this.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的通知节点。
会显示通知的详细信息。