技术开发 频道

Java SE 6 新特性: JMX 与系统管理

        JMX 的基本框架

  JMX 使用了 Java Bean 模式来传递信息。一般说来,JMX 使用有名的 MBean,其内部包含了数据信息,这些信息可能是:应用程序配置信息、模块信息、系统信息、统计信息等。另外,MBean 也可以设立可读写的属性、直接操作某些函数甚至启动 MBean 可发送的 notification 等。MBean 包括 Standard,MXBean,Dynamic,Model,Open 等几种分类,其中最简单是标准 MBean 和 MXBean,而我们使用得最多的也是这两种。MXBean 主要是 java.lang.management 使用较多,将在下一节中介绍。我们先了解其他一些重要的 MBean 的种类。

  标准 MBean

  标准 MBean 是最简单的一类 MBean,与动态 Bean 不同,它并不实现 javax.management 包中的特殊的接口。说它是标准 MBean, 是因为其向外部公开其接口的方法和普通的 Java Bean 相同,是通过 lexical,或者说 coding convention 进行的。下面我们就用一个例子来展现,如何实现一个标准 MBean 来监控某个服务器 ServerImpl 状态的。ServerImpl 代表了用来演示的某个 Server 的实现:

1 package standardbeans;
2 public class ServerImpl {
3     public final long startTime;
4     public ServerImpl() {
5         startTime = System.currentTimeMillis();
6     }
7 }
8

  然后,我们打算使用一个标准 MBean,ServerMonitor 来监控 ServerImpl:

1 package standardbeans;
2 public class ServerMonitor implements ServerMonitorMBean {
3     private final ServerImpl target;
4     public ServerMonitor(ServerImpl target){
5         this.target = target;
6     }
7     public long getUpTime(){
8         return System.currentTimeMillis() - target.startTime;
9     }
10 }
11

  这里的 ServerMonitorBean 又是怎么回事呢?MXBean 规定了标准 MBean 也要实现一个接口,所有向外界公开的方法都要在这个接口中声明。否则,管理系统就不能从中获得相应的信息。此外,该接口的名字也有一定的规范:即在标准 MBean 类名之后加上“MBean”后缀。若 MBean 的类名叫做 MBeansName 的话,对应的接口就要叫做 MBeansNameMBean。

  对于管理系统来说,这些在 MBean 中公开的方法,最终会被 JMX 转化成属性(Attribute)、监听(Listener)和调用(Invoke)的概念。如果读者对 Java Bean 有一些了解的话,不难看出,public long getUpTime() 对应了 Bean 中的一个称为“upTime”的只读属性。

  下面我们就看一个模拟管理系统的例子:

1 package standardbeans;
2 import javax.management.MBeanServer;
3 import javax.management.MBeanServerFactory;
4 import javax.management.ObjectName;
5 public class Main {
6     private static ObjectName objectName ;
7     private static MBeanServer mBeanServer;
8     public static void main(String[] args) throws Exception{
9         init();
10         manage();              
11     }
12     private static void init() throws Exception{
13         ServerImpl serverImpl = new ServerImpl();
14         ServerMonitor serverMonitor = new ServerMonitor(serverImpl);
15         mBeanServer = MBeanServerFactory.createMBeanServer();
16         objectName = new ObjectName("objectName:id=ServerMonitor1");
17         mBeanServer.registerMBean(serverMonitor,objectName);  
18     }
19     private static void manage() throws Exception{
20         Long upTime = (Long) mBeanServer.getAttribute(objectName,
21         "upTime");
22         System.out.println(upTime);
23     }
24 }
25

  JMX 的核心是 MBServer。Java SE 已经提供了一个默认实现,可以通过 MBServerFactory.createMBeanServer() 获得。每个资源监控者(MBean)一般都会有名称(ObjectName), 登记在 MBServer 内部的一个 Repository 中。注意,这个 ObjectName 对于每一个 MBServer 必须是唯一的,只能对应于一个 MBean。(读者有兴趣的话,可以试着再给 mBeanServer 注册一个同名的 objectName,看看会怎么样。) 上述例子是在 init() 方法中完成向 MBeanServer 注册工作的。

  在管理过程中,管理系统并不与资源或者 SubAgent 直接打交道,也就是说,这里不会直接引用到 MBean。而是通过 MBeanServer 的 getAttribute 方法取得对应 MBean 的属性的。

0
相关文章