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还包括可读且可能可写的命名和类型属性。 HelloMBean
interface声明了两个操作: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
。
创建名为mbean
的Hello
对象的实例。然后,通过将对象和对象名称传递给对 JMX 方法MBeanServer.registerMBean()的调用,将名为mbean
的Hello
对象作为对象名称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,请选择连接->退出。