通过 HTML 协议适配器连接至 JMX 代理
使用 compile.bat 文件编译具有全部工具和代理支持的 ClickMeterStd 应用程序,或者从代码子目录执行下列命令行:
2 <jmx install dir>\lib\jmxri.jar;
3 <jmx install dir>\lib\jmxtools.jar
4 -d classes src\dwjmxservice\basic\*.java
5
使用 runstd.bat 文件启动 ClickMeterStd 应用程序,或者从代码子目录执行下列命令行:
2 <jmx install dir>\lib\jmxri.jar;
3 <jmx install dir>\lib\jmxtools.jar;
4 classes dwjmxservice.basic.ClickMeterStd
5
这条命令启动了 ClickMeter 应用程序以及 JMX 代理。试一试 ClickMeter 应用程序中的按钮。因为我们添加 JMX 工具时没有更改一行 ClickMeter 代码,所以 ClickMeter 仍然像以前那样工作。但是,ClickMeter 的标准 MBean 已被装入 JMX 代理并且已经启动了 HTML 适配器。这允许我们立即访问代理。启动浏览器并指向:
您将会看到类似于图 4 的代理产生的页面:
图 4. 针对 HTML 协议适配器的主代理视图页面
我们可以看到由这个代理管理的所有 MBean。单击 name=ClickMeter。您将看到类似图 5 的页面:
图 5. 针对 HTML 协议适配器的详细的 ClickMeter MBean 视图
请注意由 MBean 公开的 PanelValue 属性以及 incPanelValue 和 decPanelValue 操作。如果您设置了重新装入时间,那么来自代理的客户机端 JavaScript 代码将定期地轮询 PanelValue 属性的值并更新所显示的值。尝试使用 5 到 10 秒的重新装入时间并查看更新情况。您还可以单击 ClickMeter 上的 GUI 按钮来更改该值。
接下来,尝试以下操作:
单击 incPanelMeter 操作以递增计数器的值。请注意我们是如何轻松地访问该操作的 - 如 JMX 管理应用程序可以通过代理做的那样。
单击 decPanelMeter 操作。
设置 PanelValue 属性的值。请注意它在 ClickMeter 中是如何立即被更新的。
尽管在这个例子中我们使用 HTML 协议适配器,而其它协议适配器或连接器(例如 SNMP)也可以容易地使用,并且它们将通过其它应用程序或 EMS 使我们的 ClickMeter 成为可管理的。
还记得我们说过不必将 ClickMeterStd MBean 所支持的属性和操作显式地告诉代理吗。代理实际上在运行时期间通过内省 ClickMeterStdMBean 接口发现它自己。这是使用标准 MBean 时 JMX 的标准操作。代理在运行时期间使用内省定位该管理接口(借助于必需的标准 MBean 词法命名模式)。
动态 MBean
动态 MBean 是实现 java.management.DynamicMBean 接口的 MBean。表 5 演示了该接口必须实现的方法:
表 5. 动态 MBean 接口方法
方法名 | 描述 |
getAttribute() | 获取属性名称,然后将其当前值作为 Java 对象返回 |
getAttributes() | 获取一列属性的名称,然后,如果它们的当前值可用就将其作为 Java 对象返回 |
setAttribute() | 给属性设置特定值 |
setAttributes() | 设置一列属性的值 |
invoke() | 调用特定的操作;如果适用,就提供参数并支持返回值 |
和标准 MBean 不同的是,代理依靠 DynamicMBean 接口在运行时从 MBean 获得公开的属性、操作和事件的元数据信息。这意味着当您将工具添加到应用程序中时没必要遵循词法模式(JavaBeans 编码约定)。代理使用动态 MBean 时不需要对 MBean 执行内省。它信任从 bean 接收到的元数据,该 bean 由 getMBeanInfo() 调用。因为 MBean 在运行时期间生成这个数据,所以有可能无需重新编码静态定义的接口就可以更改该数据。开始使用动态 MBean 的最快捷的方法是使用 ModelMBean 。
瞬时动态 MBean 支持:ModelMBean
ModelMBean 是存在于所有 JMX 实现之中的必需的缺省 MBean 实现。JMX 规范精确地规定了如何访问 ModelMBean 实例。因为它完全由 JMX 实现来实现的,所以模型 MBean 的优点在于它的易于使用和适应性。通常在运行时,应用程序、服务、服务器或设备可以将 ModelMBean 实例实例化成其它 JMX 层的表示。
模型 MBean 始终是动态 MBean(它必须是动态的,因为没有办法让它预先知道它的用户是谁,也就是说可以不预先知道公开的属性、操作和事件)。另外,模型 MBean 为任意软件应用程序、服务、服务器或设备提供了现成可用的 MBean 外观(或封装器)。而且模型 MBean 保证是可兼容的,因为它是实现的自身代码的一部分。
使用 ModelMBean 添加工具
让我们研究一下如何使用 ModelMBean 快速地将动态 MBean 工具添加到 ClickMeter 中。我们创建一个新的 ClickMeterInstrm 子类 - 名为 ClickMeterMod 。清单 7 演示了该类的代码:
清单 7. ClickMeterMod - 使用 ModelMBean 的工具
2 public ClickMeterMod() {
3 }
4 public static void main(String[] args) {
5 setLandF();
6 ClickMeterMod cms = new ClickMeterMod();
7 BaseModAgent myAgent = new BaseModAgent();
8 myAgent.startAgent((Object) cms);
9 }
10 }
11
请注意,清单 7 中 ClickMeterMod 类不实现任何特定的接口。它和任何编译时 JMX 需求都是完全去耦合的。这是因为我们将在运行时期间使用 JMX 参考实现中已有的模型 MBean 实现将它挂接到 JMX。这实际上是在由 BaseModAgent 类代表的代理中执行的。