Standard MBeans

本节提供了一个简单的标准 MBean 的示例。

通过编写称为SomethingMBean的 Java interface和实现该interface的Something的 Java 类来定义标准 MBean。interface中的每个方法都定义 MBean 中的属性或操作。默认情况下,每个方法都定义一个操作。属性和操作是遵循某些设计 Pattern 的方法。一个标准的 MBean 由一个 MBean interface和一个类组成。 MBean interface列出了所有公开的属性和操作的方法。该类实现此interface并提供所检测资源的功能。

以下各节检查标准 MBean 和 管理MBean 的简单的启用 JMX 技术的代理(JMX 代理)的示例。

MBean Interface

基本 MBean interfaceHelloMBean的示例如下:

package com.example; 
 
public interface HelloMBean { 
 
    public void sayHello(); 
    public int add(int x, int y); 
    
    public String getName(); 
     
    public int getCacheSize(); 
    public void setCacheSize(int size); 
}

按照约定,MBean interface采用实现它的 Java 类的名称,并添加后缀MBean。在这种情况下,该interface称为HelloMBean。下一节将介绍实现此interface的Hello类。

根据 JMX 规范,除了可以由 MBean管理 的应用程序调用的命名和类型操作之外,MBean interface还包括可读且可能可写的命名和类型属性。 HelloMBeaninterface声明了两个操作:Java 方法add()sayHello()

HelloMBean声明两个属性:Name是只读字符串,而CacheSize是可以读取和写入的整数。声明了 Getter 和 setter 方法,以允许托管应用程序访问并可能更改属性值。根据 JMX 规范的定义,getter 是任何不返回 void 并且名称以get开头的公共方法。使用吸气剂,管理 员可以读取属性的值,该属性的类型为返回对象的类型。设置器是任何采用单个参数且名称以set开头的公共方法。设置器使 管理 员可以在属性中写入新值,该值的类型与参数的类型相同。

这些操作和属性的实现在以下部分中显示。

MBean Implementation

随后的Hello Java 类实现HelloMBean MBean interface:

package com.example; 
 
public class Hello ... 
    implements HelloMBean { 
    public void sayHello() { 
        System.out.println("hello, world"); 
    } 
     
    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) {
        ...
    
        this.cacheSize = size; 
        System.out.println("Cache size now " + this.cacheSize); 
    } 
    ...
     
    private final String name = "Reginald"; 
    private int cacheSize = DEFAULT_CACHE_SIZE; 
    private static final int 
        DEFAULT_CACHE_SIZE = 200; 
}

简单的Hello类提供了HelloMBean声明的操作和属性的定义。 sayHello()add()操作非常简单,但实际操作可以根据需要简单或复杂。

还定义了获取Name属性以及获取和设置CacheSize属性的方法。在此示例中,Name属性值从不更改。但是,在实际情况下,此属性可能会随着托管资源的运行而改变。例如,该属性可能表示统计信息,例如正常运行时间或内存使用情况。在这里,属性仅仅是名称Reginald

调用setCacheSize方法可使您将CacheSize属性从其声明的默认值 200 更改。在实际情况下,更改CacheSize属性可能需要执行其他操作,例如丢弃条目或分配新条目。本示例仅打印一条消息以确认高速缓存大小已更改。但是,可以定义更复杂的操作,而不是简单地调用println()

如此定义了Hello MBean 及其interface,现在就可以使用它们来 管理 它们表示的资源,如以下部分所示。

创建用于 管理 资源的 JMX 代理

一旦 MBean 检测到资源,该资源的 管理 就由 JMX 代理执行。

JMX 代理的核心组件是 MBean 服务器。 MBean 服务器是其中注册了 MBean 的受管对象服务器。 JMX 代理还包括一组用于 管理MBean 的服务。有关 MBean 服务器实现的详细信息,请参见MBeanServerinterface的 API 文档。

接下来的Main类代表基本的 JMX 代理:

package com.example; 
 
import java.lang.management.*; 
import javax.management.*; 
 
public class Main { 
 
    public static void main(String[] args) 
        throws Exception { 
     
        MBeanServer mbs = 管理Factory.getPlatformMBeanServer(); 
        ObjectName name = new ObjectName("com.example:type=Hello"); 
        Hello mbean = new Hello(); 
        mbs.registerMBean(mbean, name); 
          
        ...
     
        System.out.println("Waiting forever..."); 
        Thread.sleep(Long.MAX_VALUE); 
    } 
}

JMX 代理Main首先通过调用java.lang.management.管理Factory类的getPlatformMBeanServer()方法来获取由平台创建和初始化的 MBean 服务器。如果平台尚未创建 MBean 服务器,则getPlatformMBeanServer()通过调用 JMX 方法MBeanServerFactory.createMBeanServer()自动创建 MBean 服务器。 Main获得的MBeanServer实例名为mbs

接下来,Main为它将创建的 MBean 实例定义一个对象名称。每个 JMX MBean 必须具有一个对象名称。对象名称是 JMX 类ObjectName的实例,并且必须符合 JMX 规范定义的语法。即,对象名称必须包含一个域和一个键属性列表。在Main定义的对象名称中,域是com.example(包含示例 MBean 的程序包)。另外,密钥属性声明此对象的类型为Hello

创建名为mbeanHello对象的实例。然后,通过将对象和对象名称传递给对 JMX 方法MBeanServer.registerMBean()的调用,将名为mbeanHello对象作为对象名称name在 MBean 服务器mbs中注册为 MBean。

通过在 MBean 服务器中注册Hello MBean,Main只需 await 在Hello上执行 管理 操作。在此示例中,这些 管理 操作是调用sayHello()add()以及获取和设置属性值。

运行标准 MBean 示例

检查了示例类之后,您现在可以运行该示例。在此示例中,使用 JConsole 与 MBean 进行交互。

要运行该示例,请按照下列步骤操作:

  • 将 Binding 的 JMX API 示例类jmx_examples.zip保存到工作目录work_dir

  • 通过在终端窗口中使用以下命令来解压缩 samples 类包。

unzip jmx_examples.zip
  • work_dir目录中编译示例 Java 类。
javac com/example/*.java
  • 如果您正在运行 Java 开发工具包(JDK)版本 6,请使用以下命令启动Main应用程序。
java com.example.Main

如果运行的 JDK 版本早于版本 6,则需要使用指定的以下选项启动Main应用程序,以公开该应用程序以进行监视和 管理。

java -Dcom.sun.management.jmxremote example.Main

显示确认Main正在 await 发生的事情。

  • 在同一台计算机上的另一个终端窗口中启动 JConsole。
jconsole

将显示“新建连接”对话框,其中列出了可以连接的正在运行的 JMX 代理。

  • 在“新建连接”对话框中,从列表中选择com.example.Main,然后单击“连接”。

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

  • 单击“ MBeans”选项卡。

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

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

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

  • 展开 MBean 树中的Hello MBean 的“属性”节点。

显示由Hello类定义的 MBean 属性。

  • CacheSize属性的值更改为 150.

在您启动Main的终端窗口中,将生成此属性更改的确认。

  • 展开 MBean 树中的Hello MBean 的“操作”节点。

可见Hello MBean 声明的两个操作sayHello()add()

  • 通过单击sayHello按钮来调用sayHello()操作。

JConsole 对话框通知您该方法已成功调用。消息“ hello,world”在运行Main的终端窗口中生成。

  • 为要添加的add()操作提供两个整数,然后单击add按钮。

答案显示在“ JConsole”对话框中。

  • 要关闭 JConsole,请选择连接->退出。