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

豆豆网   技术应用频道   2007年08月11日    社区交流

内容摘要:介绍了 Java 管理扩展(Java Management Extension,JMX) 架构及其框架,以及在 Java SE 5 中新引入的 JMX API -- java.lang.management 包, 最后作者讲述了此 API 在 Java SE 6 中的相关改进和对未来版本的展望

  其它动态 MBean

  另外还有两类 MBean:Open MBean 和 Model MBean。实际上它们也都是动态 MBean。

  Open MBean 与其它动态 MBean 的唯一区别在于,前者对其公开接口的参数和返回值有所限制 —— 只能是基本类型或者 javax.management.openmbean 包内的 ArrayType、CompositeType、TarbularType 等类型。这主要是考虑到管理系统的分布,很可能远端管理系统甚至 MBServer 层都不具有 MBean 接口中特殊的类。

  Model Bean

  然而,普通的动态 Bean 通常缺乏一些管理系统所需要的支持:比如持久化 MBean 的状态、日志记录、缓存等等。如果让用户去一一实现这些功能确实是件枯燥无聊的工作。为了减轻用户的负担,JMX 提供商都会提供不同的 ModelBean 实现。其中有一个接口是 Java 规范中规定所有厂商必须实现的:javax.management.modelmbean.RequiredModelBean。通过配置 Descriptor 信息,我们可以定制这个 Model Bean, 指定哪些 MBean 状态需要记入日志、如何记录以及是否缓存某些属性、缓存多久等等。这里,我们以 RequiredModelBean 为例讨论 ModelBean。比如,我们先来看一个例子,首先是 server 端:

package modelmbean;
public class Server {
  private long startTime;
  
  public Server() {  }
  
  public int start(){
    startTime = System.currentTimeMillis();
    return 0;
  }
  
  public long getUpTime(){
    return System.currentTimeMillis() - startTime;
  }
}

  然后我们对它的监测如下:

package modelmbean;
import javax.management.*;
import javax.management.modelmbean.*;
public class Main {
  
  public static void main(String[] args) throws Exception{
    MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer();
    RequiredModelMBean serverMBean =
      (RequiredModelMBean) mBeanServer.instantiate(
       "javax.management.modelmbean.RequiredModelMBean");    
    
    ObjectName serverMBeanName =
      new ObjectName("server: id=Server");
    serverMBean.setModelMBeanInfo(getModelMBeanInfoForServer(serverMBeanName));    
    Server server = new Server();
    serverMBean.setManagedResource(server, "ObjectReference");
    
    ObjectInstance registeredServerMBean =
      mBeanServer.registerMBean((Object) serverMBean, serverMBeanName);
    
    serverMBean.invoke("start",null, null);
    
    Thread.sleep(1000);
    
    System.out.println(serverMBean.getAttribute("upTime"));
    Thread.sleep(5000);
    System.out.println(serverMBean.getAttribute("upTime"));
  }
  
  private static ModelMBeanInfo getModelMBeanInfoForServer(ObjectName objectName)
    throws Exception{
    ModelMBeanAttributeInfo[] serverAttributes =
       new ModelMBeanAttributeInfo[1];
    Descriptor upTime =
       new DescriptorSupport(
        new String[] {
         "name=upTime",
         "descriptorType=attribute",
         "displayName=Server upTime",
         "getMethod=getUpTime",         
          });
    serverAttributes[0] =
       new ModelMBeanAttributeInfo(
        "upTime",
        "long",
        "Server upTime",
        true,
        false,
        false,
        upTime);
    
    ModelMBeanOperationInfo[] serverOperations =
       new ModelMBeanOperationInfo[2];
    
    Descriptor getUpTimeDesc =
       new DescriptorSupport(
        new String[] {
         "name=getUpTime",
         "descriptorType=operation",
         "class=modelmbean.Server",
         "role=operation"         
         });
    
    MBeanParameterInfo[] getUpTimeParms = new MBeanParameterInfo[0];
    serverOperations[0] = new ModelMBeanOperationInfo("getUpTime",
         "get the up time of the server",
         getUpTimeParms,
         "java.lang.Long",
         MBeanOperationInfo.ACTION,
         getUpTimeDesc);
      
    Descriptor startDesc =
       new DescriptorSupport(
        new String[] {
         "name=start",
         "descriptorType=operation",
         "class=modelmbean.Server",
         "role=operation"
         });
    MBeanParameterInfo[] startParms = new MBeanParameterInfo[0];
    serverOperations[1] = new ModelMBeanOperationInfo("start",
         "start(): start server",
         startParms,
         "java.lang.Integer",
         MBeanOperationInfo.ACTION,
         startDesc);
    
    ModelMBeanInfo serverMMBeanInfo =
       new ModelMBeanInfoSupport(
        "modelmbean.Server",
        "ModelMBean for managing an Server",
        serverAttributes,
        null,
        serverOperations,
        null);
    
    //Default strategy for the MBean.
    Descriptor serverDescription =
       new DescriptorSupport(
        new String[] {
         ("name=" + objectName),
         "descriptorType=mbean",
         ("displayName=Server"),
         "type=modelmbean.Server",
         "log=T",
         "logFile=serverMX.log",
         "currencyTimeLimit=10" });
    serverMMBeanInfo.setMBeanDescriptor(serverDescription);
    return serverMMBeanInfo;
   }

来源:IBM    作者:吕晶 李夷磊    责编:豆豆技术应用

正在加载评论...