技术开发 频道

从黑箱到企业: Bean,JMX 1.1 样式

  通过 HTML 协议适配器连接至 JMX 代理

  使用 compile.bat 文件编译具有全部工具和代理支持的 ClickMeterStd 应用程序,或者从代码子目录执行下列命令行:

1 javac -classpath
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 应用程序,或者从代码子目录执行下列命令行:

1 java -classpath
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 适配器。这允许我们立即访问代理。启动浏览器并指向:

1 http://localhost:8082/

  您将会看到类似于图 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 的工具

1 public class ClickMeterMod extends ClickMeterInstrm  {
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 类代表的代理中执行的。

0
相关文章