本教程是为 JDK 8 编写的。本页中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
有关 Java SE 9 及后续版本中更新的语言功能的摘要,请参阅Java 语言变更。
有关所有 JDK 发行版的新功能、增强功能和已删除或已弃用选项的信息,请参阅JDK 发行说明。
本节介绍了一种特殊类型的MBean,称为MXBeans。
MXBean是一种只引用预定义数据类型的MBean。通过这种方式,您可以确保您的MBean可被任何客户端使用,包括远程客户端,而无需客户端访问表示MBean类型的特定模型类。MXBeans提供了一种方便的方式将相关值捆绑在一起,而不需要客户端特别配置来处理这些捆绑。
与标准MBean一样,MXBean是通过编写一个名为SomethingMXBean的Java接口和实现该接口的Java类来定义的。然而,与标准MBean不同,MXBeans不要求Java类的名称为Something。接口中的每个方法都定义了MXBean中的属性或操作。注解@MXBean也可以用于注释Java接口,而不需要接口的名称后跟MXBean后缀。
MXBeans在Java 2 Platform, Standard Edition (J2SE) 5.0软件中存在于包java.lang.management中。然而,现在用户可以自定义自己的MXBeans,除了在java.lang.management中定义的标准集合之外。
MXBeans背后的主要思想是,像java.lang.management.MemoryUsage这样在MXBean接口中引用的类型,java.lang.management.MemoryMXBean在这种情况下,被映射到一组标准类型,即在包javax.management.openmbean中定义的所谓Open Types。确切的映射规则在MXBean规范中有详细说明。然而,一般原则是对于诸如int或String之类的简单类型保持不变,而对于诸如MemoryUsage之类的复杂类型,映射为标准类型CompositeDataSupport。
MXBean示例由以下文件组成,这些文件位于jmx_examples.zip中:jmx_examples.zip:
QueueSamplerMXBean接口QueueSampler类getQueueSample()方法在MXBean接口中返回的Java类型QueueSampleMain,设置并运行示例的程序MXBean示例使用以下类执行以下操作:
Queue<String>的资源getQueueSample,当调用时获取队列的快照,并返回一个Java类QueueSample,其中包含以下值:
下面的代码展示了示例QueueSamplerMXBean MXBean接口:
package com.example;
public interface QueueSamplerMXBean {
public QueueSample getQueueSample();
public void clearQueue();
}
注意,你声明一个MXBean接口的方式与声明标准MBean接口的方式完全相同。QueueSamplerMXBean接口声明了一个getter方法getQueueSample和一个操作clearQueue。
MXBean操作在QueueSampler示例类中声明,如下所示:
package com.example;
import java.util.Date;
import java.util.Queue;
public class QueueSampler
implements QueueSamplerMXBean {
private Queue<String> queue;
public QueueSampler (Queue<String> queue) {
this.queue = queue;
}
public QueueSample getQueueSample() {
synchronized (queue) {
return new QueueSample(new Date(),
queue.size(), queue.peek());
}
}
public void clearQueue() {
synchronized (queue) {
queue.clear();
}
}
}
QueueSampler定义了MXBean接口声明的getQueueSample() getter和clearQueue()操作。 getQueueSample()操作返回一个QueueSample Java类型的实例,该实例是使用java.util.Queue的peek()和size()方法返回的值以及java.util.Date的实例创建的。
QueueSampler方法返回的QueueSample实例在QueueSample类中定义如下:
package com.example;
import java.beans.ConstructorProperties;
import java.util.Date;
public class QueueSample {
private final Date date;
private final int size;
private final String head;
@ConstructorProperties({"date", "size", "head"})
public QueueSample(Date date, int size,
String head) {
this.date = date;
this.size = size;
this.head = head;
}
public Date getDate() {
return date;
}
public int getSize() {
return size;
}
public String getHead() {
return head;
}
}
在QueueSample类中,MXBean框架调用QueueSample中的所有getter方法将给定的实例转换为CompositeData实例,并使用@ConstructorProperties注解从CompositeData实例重构一个QueueSample实例。
到目前为止,已经定义了MXBean接口和实现它的类,以及返回的Java类型。接下来,MXBean必须在MBean服务器中创建并注册。这些操作由与标准MBean示例中使用的相同的Main示例JMX代理执行,但在标准MBean教程中没有显示相关代码。
package com.example;
import java.lang.management.ManagementFactory;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import javax.management.MBeanServer;
import javax.management.ObjectName;
public class Main {
public static void main(String[] args) throws Exception {
MBeanServer mbs =
ManagementFactory.getPlatformMBeanServer();
...
ObjectName mxbeanName = new ObjectName("com.example:type=QueueSampler");
Queue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Request-1");
queue.add("Request-2");
queue.add("Request-3");
QueueSampler mxbean = new QueueSampler(queue);
mbs.registerMBean(mxbean, mxbeanName);
System.out.println("Waiting...");
Thread.sleep(Long.MAX_VALUE);
}
}
Main类执行以下操作:
QueueSampler 创建对象名称。QueueSampler MXBean创建Queue实例以进行处理。Queue实例提供给新创建的QueueSampler MXBean。MXBean示例使用了来自jmx_examples.zip捆绑包中的类,这些类在标准MBeans部分中已经使用过。此示例需要Java SE平台的版本6。要运行MXBeans示例,请按照以下步骤进行:
jmx_examples.zip保存到work_dir目录中。unzip jmx_examples.zip
work_dir目录中编译示例Java类。
javac com/example/*.java
Main应用程序。将生成一个等待某些事件发生的确认信息。
java com.example.Main
jconsole
com.example.Main并点击连接。
显示平台当前活动的摘要信息。
此面板显示当前在MBean服务器中注册的所有MBean。
com.example节点。
您将看到由Main创建和注册的示例MBean QueueSampler。如果您点击QueueSampler,您将在MBean树中看到其关联的Attributes和Operations节点。
您将在右侧窗格中看到QueueSample属性,其值为javax.management.openmbean.CompositeDataSupport。
CompositeDataSupport值。
您将看到QueueSample的值date,head和size,因为MXBean框架已将QueueSample实例转换为CompositeData。如果您将QueueSampler定义为标准MBean而不是MXBean,JConsole将无法找到QueueSample类,因为它不在其类路径中。如果QueueSampler是标准MBean,当检索QueueSample属性值时,您将收到ClassNotFoundException消息。JConsole能够找到QueueSampler表明在通过通用JMX客户端(如JConsole)连接到JMX代理时使用MXBeans的有用性。
显示一个调用clearQueue操作的按钮。
clearQueue按钮。
显示成功调用该方法的确认信息。
CompositeDataSupport值。
head和size的值已被重置。