MXBean 的

原文: https://docs.oracle.com/javase/tutorial/jmx/mbeans/mxbeans.html

本节介绍一种特殊类型的 MBean,称为 MXBeans

MXBean 是一种 MBean,仅引用一组预定义的数据类型。通过这种方式,您可以确保任何客户端(包括远程客户端)都可以使用您的 MBean,而无需客户端访问表示 MBean 类型的特定于模型的类。 MXBeans 提供了将相关值捆绑在一起的便捷方式,而无需特别配置客户端来处理捆绑包。

与标准 MBean 的方式相同,MXBean 是通过编写名为SomethingMXBean的 Java 接口和实现该接口的 Java 类来定义的。但是,与标准 MBean 不同,MXBeans 不需要调用 Java 类Something。接口中的每个方法都定义 MXBean 中的属性或操作。注释@MXBean也可用于注释 Java 接口,而不是要求接口的名称后跟 MXBean 后缀。

MXBeans 存在于 Java 2 平台标准版(J2SE)5.0 软件的 java.lang.management 包中。但是,除了java.lang.management中定义的标准集之外,用户现在还可以定义自己的 MXBean。

MXBeans 背后的主要思想是在 MXBean 接口中引用的 java.lang.management.MemoryUsage 等类型,在这种情况下为 java.lang.management.MemoryMXBean ,它们被映射到一组标准类型中,所谓开放类型,在包 javax.management.openmbean 中定义。确切的映射规则出现在 MXBean 规范中。但是,一般原则是简单类型(如 int 或 String)保持不变,而复杂类型(如MemoryUsage]则映射到标准类型 CompositeDataSupport

MXBean 示例包含以下文件,可在 jmx_examples.zip 中找到:

  • QueueSamplerMXBean接口
  • 实现 MXBean 接口的QueueSampler
  • QueueSample MXBean 接口中getQueueSample()方法返回的 Java 类型
  • Main,设置并运行示例的程序

MXBean 示例使用这些类来执行以下操作:

  • 定义一个管理Queue<String>类型资源的简单 MXBean
  • 在 MXBean 中声明一个 getter,getQueueSample,它在调用时获取队列的快照,并返回将以下值捆绑在一起的 Java 类QueueSample
    • 拍摄快照的时间
    • 队列大小
    • 在给定时间排队的队长
  • 在 MBean 服务器中注册 MXBean

MXBean 接口

以下代码显示了示例 QueueSamplerMXBean MXBean 接口:

  1. package com.example;
  2. public interface QueueSamplerMXBean {
  3. public QueueSample getQueueSample();
  4. public void clearQueue();
  5. }

请注意,您声明 MXBean 接口的方式与声明标准 MBean 接口的方式完全相同。 QueueSamplerMXBean接口声明一个 getter,getQueueSample和一个操作,clearQueue

定义 MXBean 操作

MXBean 操作在 QueueSampler 示例类中声明,如下所示:

  1. package com.example;
  2. import java.util.Date;
  3. import java.util.Queue;
  4. public class QueueSampler
  5. implements QueueSamplerMXBean {
  6. private Queue<String> queue;
  7. public QueueSampler (Queue<String> queue) {
  8. this.queue = queue;
  9. }
  10. public QueueSample getQueueSample() {
  11. synchronized (queue) {
  12. return new QueueSample(new Date(),
  13. queue.size(), queue.peek());
  14. }
  15. }
  16. public void clearQueue() {
  17. synchronized (queue) {
  18. queue.clear();
  19. }
  20. }
  21. }

QueueSampler定义 MXBean 接口声明的getQueueSample() getter 和clearQueue()操作。 getQueueSample()操作返回QueueSample Java 类型的实例,该实例是使用 java.util.Queue 方法peek()size()返回的值创建的,的实例java.util.Date

定义 MXBean 接口返回的 Java 类型

QueueSampler返回的QueueSample实例在 QueueSample 类中定义,如下所示:

  1. package com.example;
  2. import java.beans.ConstructorProperties;
  3. import java.util.Date;
  4. public class QueueSample {
  5. private final Date date;
  6. private final int size;
  7. private final String head;
  8. @ConstructorProperties({"date", "size", "head"})
  9. public QueueSample(Date date, int size,
  10. String head) {
  11. this.date = date;
  12. this.size = size;
  13. this.head = head;
  14. }
  15. public Date getDate() {
  16. return date;
  17. }
  18. public int getSize() {
  19. return size;
  20. }
  21. public String getHead() {
  22. return head;
  23. }
  24. }

QueueSample类中,MXBean 框架调用QueueSample中的所有 getter 将给定实例转换为 CompositeData 实例,并使用@ConstructorProperties注释重建QueueSample实例一个CompositeData实例。

在 MBean Server 中创建和注册 MXBean

到目前为止,已经定义了以下内容:MXBean 接口和实现它的类,以及返回的 Java 类型。接下来,必须在 MBean 服务器中创建并注册 MXBean。这些操作由标准 MBean 示例中使用的相同 Main 示例 JMX 代理执行,但相关代码未显示在标准 MBean 课程中。

  1. package com.example;
  2. import java.lang.management.ManagementFactory;
  3. import java.util.Queue;
  4. import java.util.concurrent.ArrayBlockingQueue;
  5. import javax.management.MBeanServer;
  6. import javax.management.ObjectName;
  7. public class Main {
  8. public static void main(String[] args) throws Exception {
  9. MBeanServer mbs =
  10. ManagementFactory.getPlatformMBeanServer();
  11. ...
  12. ObjectName mxbeanName = new ObjectName("com.example:type=QueueSampler");
  13. Queue<String> queue = new ArrayBlockingQueue<String>(10);
  14. queue.add("Request-1");
  15. queue.add("Request-2");
  16. queue.add("Request-3");
  17. QueueSampler mxbean = new QueueSampler(queue);
  18. mbs.registerMBean(mxbean, mxbeanName);
  19. System.out.println("Waiting...");
  20. Thread.sleep(Long.MAX_VALUE);
  21. }
  22. }

Main类执行以下操作:

  • 获取平台 MBean 服务器。
  • 为 MXBean QueueSampler.创建对象名称
  • 为要处理的QueueSampler MXBean 创建Queue实例。
  • Queue实例提供给新创建的QueueSampler MXBean。
  • 以与标准 MBean 完全相同的方式在 MBean 服务器中注册 MXBean。

运行 MXBean 示例

MXBean 示例使用您在标准 MBeans 部分中使用的 jmx_examples.zip 包中的类。此示例需要 Java SE 平台的第 6 版。要运行 MXBeans 示例,请执行以下步骤:

  1. 如果尚未这样做,请将 jmx_examples.zip 保存到work_dir目录中。
  2. 在终端窗口中使用以下命令解压缩示例类包。

    1. unzip jmx_examples.zip
  3. 编译work_dir目录中的示例 Java 类。

    1. javac com/example/*.java
  4. 启动Main应用程序。生成Main正在等待发生某事的确认。

    1. java com.example.Main
  5. 在同一台计算机上的另一个终端窗口中启动 JConsole。将显示“新建连接”对话框,其中列出了可以连接的正在运行的 JMX 代理的列表。

    1. jconsole
  6. In the New Connection dialog box, select com.example.Main from the list and click Connect.

    将显示平台当前活动的摘要。

  7. Click the MBeans tab.

    此面板显示当前在 MBean 服务器中注册的所有 MBean。

  8. In the left frame, expand the com.example node in the MBean tree.

    您会看到Main创建并注册的示例 MBean QueueSampler。如果单击QueueSampler,则会在 MBean 树中看到其关联的“属性”和“操作”节点。

  9. Expand the Attributes node.

    您会看到QueueSample属性出现在右侧窗格中,其值为javax.management.openmbean.CompositeDataSupport

  10. Double-click the CompositeDataSupport value.

    您会看到QueueSampledateheadsize,因为 MXBean 框架已将QueueSample实例转换为CompositeData。如果您已将QueueSampler定义为标准 MBean 而不是 MXBean,则 JConsole 将找不到QueueSample类,因为它不在其类路径中。如果QueueSampler是标准 MBean,则在检索QueueSample属性值时会收到ClassNotFoundException消息。 JConsole 找到QueueSampler这一事实证明了在通过 JConsole 等通用 JMX 客户端连接到 JMX 代理时使用 MXBeans 的有用性。

  11. Expand the Operations node.

    显示调用clearQueue操作的按钮。

  12. Click the clearQueue button.

    显示已成功调用该方法的确认。

  13. Expand the Attributes node again, and double click on the CompositeDataSupport value.

    headsize值已重置。

  14. 要关闭 JConsole,请选择 Connection - >出口。