技术开发 频道

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

  实现标准 MBean

  在一个标准 MBean 中,向管理代理公开的所有属性、操作和事件都在固定的接口中指定。这个接口的名称必须遵循下面这个词法模式: <服务/应用程序/设备的类名> MBean。

  在我们的示例中,我们已经用标准 MBean 工具创建了一个名叫 ClickMeterStd 的 ClickMeterInstrm 子类,它将包含 ClickMeter 应用程序。由于应用程序名为 ClickMeterStd ,因此标准 MBean 工具必须遵循词法模式,并命名为 ClickMeterStdMBean 。清单 2 定义了 ClickMeterStdMBean.java(可在源代码分发版中获得该文件)的接口:

  清单 2. ClickMeterStdMBean 管理接口

1 package dwjmxservice.basic;
2 public interface ClickMeterStdMBean {
3   public void setPanelValue(Integer inVal);
4   public Integer getPanelValue();
5   public void incPanelValue();
6   public void decPanelValue();
7 }
8

  在清单 2 中,已公开的属性作为公共的 getter 方法和 setter 方法(用于 PanelValue 属性)列出,并且操作也是公共的方法( incPanelValue() 和 decPanelValue() 操作)。

  JMX 代理将使用标准的 Java 内省(introspection)确定运行时期间 MBean 所支持的属性和操作。现在我们将创建简单的 JMX 代理。

  创建简单的 JMX 代理

  JMX 代理通过 MBeanServer(在 JMX 规范中定义了其接口)装载 MBean。它还提供了一组所需的代理服务,还提供了协议适配器或直接连接到 JMX 管理器或 EMS/NMS 的连接器。

  日益智能化的网络设备、PC 和外围设备的出现,对这些端点的日常管理和监控方面提出了越来越高的智能化要求。而且,通过因特网处理业务的需求日益增长,从而产生了一种新的需要 EMS 支持的端点 - 即智能软件服务器/服务。

  图 3 应使您想起 JMX 代理的组件化组成。在 JMX 体系结构中,代理层聚合 MBean 并公开属性、操作和事件让分布式服务层来管理。代理可以直接传递来自其聚合的 MBean 的可管理元素,或者为其自身可管理元素组提供增值特性和公开。

  图 3. JMX 代理的组成

  参考实现提供了一个简单的代理所需的所有元素。但是,唯一完全实现的与外部世界的连接是 HTML 协议适配器。该协议适配器允许 Web 浏览器查看并访问代理所管理的所有 MBean 的可管理元素。

  让我们添加代码以配置代理并使用其协议适配器。我们将对启动 JMX 参考实现代理的支持添加到 ClickMeterStd 中。清单 3 演示了负责实例化和启动该代理的代码:

  清单 3. 用于实例化和启动 JMX 代理的代码

1 BaseStdAgent myAgent = new BaseStdAgent();
2     myAgent.startAgent((Object) cms);
3

  请注意 BaseStdAgent 类的使用(请参阅源代码分发版中的 BaseStdAgent.java)。本质上,代理中的逻辑包括下列程序步骤:

  启动 MBeanServer。

  向 MBeanServer 注册受管的 MBean。

  启动协议适配器和连接器。

  在生产编码中,将 JMX 规范所需求的大多数代理服务也作为 MBean 装入。这意味着步骤 2 还将注册代理服务的所有 MBean。事实上,就我们在此使用的 HTML 协议适配器而言,它也是 MBean。清单 4 演示了 BaseStdAgent.java 中执行步骤 1 的代码:

  清单 4. BaseStdAgent 中创建和启动 MBeanServer 的代码

1 System.out.println("Creating the MBeanServer....");
2     MBeanServer server = MBeanServerFactory.createMBeanServer();
3

  清单 5 演示了执行步骤 2 的代码。在这个例子中,将第一个 MBean 作为 inMBean 参数传递给 BaseStdAgent 。我们还给它一个用户可读的 ObjectName 。

  清单 5. 向 MBeanServer 注册受管的 MBean

1 try {
2         ObjectName tpMBeanName = new ObjectName("MBean:name=ClickMeter");
3         server.registerMBean(inMBean, tpMBeanName);
4       } catch (Exception e) {
5          System.out.println("Cannot register ClickMeter MBean!");
6          e.printStackTrace();
7          return;
8       }
9

  BaseStdAgent 中最后部分的代码启动了 HTML 协议适配器,它位于 com.sun.jdmk.comm.HtmlAdaptorServer 类中。清单 6 演示了如何设置并启动协议适配器。缺省情况,它监控用于 HTML 浏览器连接的端口 8082。请注意用于注册 HTML 协议适配器的 server.registerMBean() 方法的使用,其本身就是 MBean。

  清单 6. 创建和启动 HTML 协议适配器

1 System.out.println("Creating an HTML protocol adaptor..");
2     HtmlAdaptorServer hadaptor = new HtmlAdaptorServer();
3     ObjectName adaptorName = null;
4     try {
5         adaptorName = new ObjectName("Adaptor:name=hadaptor,port=8082");
6         server.registerMBean(hadaptor, adaptorName);
7     } catch(Exception e) {
8         System.out.println("Cannot create the HTML protocol adaptor!");
9         e.printStackTrace();
10         return;
11     }
12     hadaptor.start();
13

  以上是这个简单代理中的所有代码。如果要支持更多的代理服务,可以用和 HTML 协议适配器同样的方式向 MBeanServer 注册它们。

  要注意的是,这个简单 JMX 代理的代码是独立于它要管理的 MBean( ClickMeterStd 和 HtmlAdaptorServer )编写的。同样,MBean 代码是独立于最终用来管理它的代理编写的。这是 JMX 多层体系结构的本质。工具层的 MBean 旨在与代理层的代理逻辑松散去耦合。

0
相关文章