技术开发 频道

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

  【IT168 技术文章】

        简单的 GUI 应用程序:ClickMeter

  我们的样本应用程序 ClickMeter 是基于 Swing 的 GUI 实用程序,它以典型的 MVC 设计为特色。它显示了其 GUI 上的“数字计数器”和两个按钮。单击 +按钮递增显示的数字,单击 -按钮则递减显示的数字。表 1 列出了应用程序中的文件:

  表 1. ClickMeter GUI 应用程序中的文件

文件名描述
ClickMeter.java带有我们将执行的静态 main 方法的类;它创建 GUI 框架,将其置中并显示它
ClickFrame.java包含 ClickPanel 的框架容器
ClickPanel.java单一源文件,包含用于 GUI 应用程序的三个类: ClickPanelModel (模型)、 ClickPanel (视图)和 ClickPanelController (控制器)。

  负责 GUI 表示的视图类是 ClickFrame ,它是 javax.swing.JPanel 的子类。它创建 GUI 元素,将它们布置在面板上并管理用户与 GUI 的交互。ClickMeter 的 MVC 操作如图 1 所示:

  图 1. ClickMeter 的 MVC 交互

  在图 1 中, ClickPanelModel (模型)保持一个代表计数器瞬时值的 int 值(名为 val )。要访问该值,您必须通过 ClickPanelModel 类的方法。这些方法包括用于 val 变量的 set() 、 get() 、 increment() 和 decrement() 。 ClickPanel 是典型的 ClickPanelModel 的观察器。无论 ClickPanelModel 值何时更改,它都会通过调用 NotifyUpdate() 方法将更改通知给 ClickPanel 。

  此时, ClickPanel 取出模型已更改的值并将它重新显示在包含该值的 GUI 面板上。这确保了显示在 ClickPanel 上的值始终和 ClickPanelModel 中的值保持一致。为完成这一循环, ClickPanel 管理用户和 GUI 的交互(例如,单击两个按钮中的一个),然后将所有操作都传递给 ClickPanelController (使用 onIncButtonClicked 或 onDecButtonClicked 方法)。 ClickPanelController 通过修改 ClickPanelModel 的值使 GUI 操作与所期望的计数器操作协调。这是通过调用 ClickPanelController 的 incPanelValue() 和 decPanelValue() 方法实现的。

  试验 ClickMeter:不使用 JMX

  使用代码分发版中提供的 compile.bat 批处理文件来编译应用程序,或从代码子目录执行下列命令行:

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       

  使用 runmeter.bat 文件运行应用程序,或者从代码子目录执行下列命令行:

1 java -classpath
2         <jmx install dir>\lib\jmxri.jar;
3         <jmx install dir>\lib\jmxtools.jar;
4 classes dwjmxservice.basic.ClickMeter
5

  图 2 显示了运行的应用程序。您可以在任何时候单击这两个按钮来递增或递减计数器值。

  图 2. ClickMeter GUI 应用程序

  要注意的一件很重要的事是,整个应用程序的设计没有考虑可管理性。也就是说,应用程序中完全没有引用任何 JMX 类,并且它不是用任何可使 JMX 代码的添加变得更容易或更困难的方法来构建的。简单地讲,这反映出它是设计良好的 Java GUI 应用程序 - 不关心对 JMX 操作的适应性。而且这也是 JMX 的本质:能很容易地将它添加到任何应用程序或软件服务器/服务,使它们立即成为是可管理的。JMX 的这一“易添加”特性的结果是很低的实现开发成本。接下来,您将看到如何能快速地将工具添加到 ClickMeter 应用程序。

  规划工具

  工具能添加到任何 Java 程序(包括任何软件服务、服务器或应用程序)中。工具涉及可管理的属性(特性)、操作(方法)和事件,它们可以向 JMX 代理公开(并通过这些代理向 EMS 和管理应用程序公开)。JMX 设计者首先必须确定要添加的工具。

  您可以很容易地添加工具来管理联网设备和软件服务/服务器。对于联网设备来说,属性可以是所用设备的 IP 地址和端口、所支持的协议、协议的参数等等。对设备的操作可以包括复位出厂缺省值、重新引导、固件升级等等。对于 Web 应用程序服务器来说,属性可以是每个单位时间“命中”的总数、用在服务器上的 CPU 时间总量或服务器上执行的应用程序的组合。对应用程序服务器进行的操作可以包括复位、重新引导和应用程序在服务器上的装入和卸载。

  但是我们主要关心的是 ClickMeter。ClickMeter 中有什么是要受管的呢?表 2 给出了一些答案:

  表 2. 受管的元素

受管的元素类型描述
PanelValue属性计数器的瞬时值;和 ClickPanelModel 所保持的值一样
incPanelValue操作计数器值加 1;和用户单击 +按钮的操作一样
decPanelValue操作计数器值减 1;和用户单击 -按钮的操作一样
 

      添加工具的第一步是确保可管理元素容易访问。为了帮助做到这一点,我们将一些方法添加到 ClickMeter 类中。为了保持原有的 ClickMeter 应用程序 - 让它完全与 JMX 代码无关 - 我们创建 ClickMeter 的子类,称为 ClickMeterInstrm 。该类的方法如表 3 所示:

  表 3. 公开 ClickMeterInstrm 的属性和操作的方法

方法描述
getPanelValue()通过模型( ClickPanelModel )获取计数器的当前值
setPanelValue()通过模型来设置计数器的当前值,因为我们知道 MVC 模式设计将确保所有视图和模型同步。
incPanelValue()通过模型,使计数器值加 1
decPanelValue()通过模型,使计数器值减 1
 

     单 1 演示了 ClickMeterInstrm 类的实现:

  清单 1. ClickMeterInstrm 代码 

1 package dwjmxservice.basic;
2 public class ClickMeterInstrm extends ClickMeter {
3   public ClickMeterInstrm() {
4   }
5   // code added to instrument for JMX Instrumentation
6   public void setPanelValue(Integer val) {
7       frame.clickPanel.myModel.setVal(val.intValue());
8   }
9   public Integer getPanelValue() {
10    return new Integer(frame.clickPanel.myModel.getVal());
11   }
12   public void incPanelValue() {
13   frame.clickPanel.myModel.incVal();
14   }
15   public void decPanelValue() {
16   frame.clickPanel.myModel.decVal();
17   }
18 }
19

  请注意清单 1 中所示的新方法的实现如何使用 ClickPanelModel 来更改计数器的值。 setPanelValue() 和 getPanelValue() 方法/操作提供了符合 JavaBeans 的命名约定,该约定公开了 PanelValue 特性/属性。一旦我们添加标准 Mbean 支持,这就会显得很重要。

  原有的 GUI 应用程序 ClickMeter 仍是原封不动的,完全不受这次添加的影响。

  既然我们已经添加了逻辑来支持对一个属性和两个操作的访问,那么我们可以添加将它们向管理代理公开的机制。要实现这一点,我们将 JMX MBean(受管的 bean,managed bean)支持添加到 ClickMeter 应用程序中。正如我们在 第 1 部分中学到的那样,MBean 实现至少有两种不同的主要样式,如表 4 所示:

  表 4. 两种不同样式的 MBean 实现

MBean 实现描述
标准所有属性、操作和事件都在编译时通过固定的管理接口进行定义。
动态Mbean 所支持的受管属性、操作和事件直到运行时才确定 - 并且可以在调用之间或者甚至在一个管理会话期间动态变化

  将工具添加到 ClickMeter 中最快、最简单的方法是使用标准 MBean 实现。

0
相关文章