文档

Java™教程
隐藏目录
MXBeans
路径: Java管理扩展 (JMX)
课程: 介绍 MBeans

MXBeans

本节介绍了一种特殊类型的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

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

MXBean接口

下面的代码展示了示例QueueSamplerMXBean MXBean接口:

package com.example; 
 
public interface QueueSamplerMXBean { 
    public QueueSample getQueueSample(); 
    public void clearQueue(); 
} 

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

定义MXBean操作

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.Queuepeek()size()方法返回的值以及java.util.Date的实例创建的。

定义MXBean接口返回的Java类型

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实例。

创建并在MBean服务器中注册MXBean

到目前为止,已经定义了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类执行以下操作:

运行MXBean示例

MXBean示例使用了来自jmx_examples.zip捆绑包中的类,这些类在标准MBeans部分中已经使用过。此示例需要Java SE平台的版本6。要运行MXBeans示例,请按照以下步骤进行:

  1. 如果还没有这样做,请将jmx_examples.zip保存到work_dir目录中。
  2. 在终端窗口中使用以下命令解压示例类的包。
    unzip jmx_examples.zip
    
  3. work_dir目录中编译示例Java类。
    javac com/example/*.java
    
  4. 启动Main应用程序。将生成一个等待某些事件发生的确认信息。
    java com.example.Main
    
  5. 在同一台机器的不同终端窗口中启动JConsole。将显示一个新的连接对话框,列出您可以连接到的正在运行的JMX代理列表。
    jconsole
    
  6. 在新的连接对话框中,从列表中选择com.example.Main并点击连接。

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

  7. 点击MBeans标签。

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

  8. 在左侧框架中,展开MBean树中的com.example节点。

    您将看到由Main创建和注册的示例MBean QueueSampler。如果您点击QueueSampler,您将在MBean树中看到其关联的Attributes和Operations节点。

  9. 展开Attributes节点。

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

  10. 双击CompositeDataSupport值。

    您将看到QueueSample的值dateheadsize,因为MXBean框架已将QueueSample实例转换为CompositeData。如果您将QueueSampler定义为标准MBean而不是MXBean,JConsole将无法找到QueueSample类,因为它不在其类路径中。如果QueueSampler是标准MBean,当检索QueueSample属性值时,您将收到ClassNotFoundException消息。JConsole能够找到QueueSampler表明在通过通用JMX客户端(如JConsole)连接到JMX代理时使用MXBeans的有用性。

  11. 展开Operations节点。

    显示一个调用clearQueue操作的按钮。

  12. 点击clearQueue按钮。

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

  13. 再次展开Attributes节点,并双击CompositeDataSupport值。

    headsize的值已被重置。

  14. 要关闭JConsole,选择Connection -> Exit。

上一页: 标准 MBeans
下一页: 通知