实现标准 MBean
在一个标准 MBean 中,向管理代理公开的所有属性、操作和事件都在固定的接口中指定。这个接口的名称必须遵循下面这个词法模式: <服务/应用程序/设备的类名> MBean。
在我们的示例中,我们已经用标准 MBean 工具创建了一个名叫 ClickMeterStd 的 ClickMeterInstrm 子类,它将包含 ClickMeter 应用程序。由于应用程序名为 ClickMeterStd ,因此标准 MBean 工具必须遵循词法模式,并命名为 ClickMeterStdMBean 。清单 2 定义了 ClickMeterStdMBean.java(可在源代码分发版中获得该文件)的接口:
清单 2. ClickMeterStdMBean 管理接口
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 代理的代码
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 的代码
2 MBeanServer server = MBeanServerFactory.createMBeanServer();
3
清单 5 演示了执行步骤 2 的代码。在这个例子中,将第一个 MBean 作为 inMBean 参数传递给 BaseStdAgent 。我们还给它一个用户可读的 ObjectName 。
清单 5. 向 MBeanServer 注册受管的 MBean
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 协议适配器
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 旨在与代理层的代理逻辑松散去耦合。