本教程是为 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类型QueueSample
Main
,设置并运行示例的程序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
的值已被重置。