科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java SE 6 新特性: JMX 与系统管理

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在 Java 程序的运行过程中,对 JVM 和系统的监测一直是 Java 开发人员在开发过程所需要的。

作者:吕 晶 李夷磊 来源:天极论坛整理 2007年10月12日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共4页)


  其它动态 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; 
      } 

  很明显,和其它 MBean 类似,使用 Model MBean 的过程也是下面几步:
  1. 创建一个 MBServer:mBeanServe
  2. 获得管理资源用的 MBean:serverBean
  3. 给这个 MBean 一个 ObjectName:serverMBeanName
  4. 将 serverBean 以 serverMBeanName 注册到 mBeanServer 上去
  唯一不同的是,ModelMBean 需要额外两步:

1.serverMBean.setModelMBeanInfo(getModelMBeanInfoForServer(serverMBeanName)); 
2.serverMBean.setManagedResource(server, "ObjectReference"); 

  第一步用于提供 serverMBean 的元数据,主要包括以下两类
  1. 类似于普通的动态 MBean,需要 MBean 的 Attribute、Invocation、Notification 的类型/反射信息,诸如返回类型、参数类型和相关的 get/set 方法等。这里将不再赘述。
  2. 关于缓存、持久化以及日志等的策略。后面我们将介绍一些这方面的信息。
  第二步指出了 ServerMBean 管理的对象,也就是说,从元数据中得到的 Method 将施加在哪个 Object 上。需要指出的是 >setManagedResource(Object o, String type); 中第二个参数是 Object 类型,可以是 "ObjectReference"、"Handle"、"IOR"、"EJBHandle" 或 "RMIReference"。目前 SE 中的实现只支持 "ObjectReference"。笔者认为后面几种类型是为了将来 JMX 管理对象扩展而设定的,可能将来 Model Bean 不仅可以管理 Plain Java Object(POJO),还可能管理 Native Resource, 并给诸如 EJB 和 RMI 对象的管理提供更多的特性。

  Model Bean 与普通动态 Bean 区别在于它的元数据类型 ModelMBeanInfo 扩展了前者的 MBeanInfo,使得 ModelMBeanOperationInfo、ModelMBeanConstructor_Info、ModelMBeanAttributeInfo 和 ModelMBeanNotificationInfo 都有一个额外的元数据:>javax.management.Descriptor,它是用来设定 Model Bean 策略的。数据的存储是典型的 "key-value" 键值对。不同的 Model Bean 实现,以及不同的 MBeanFeatureInfo 支持不同的策略特性。下面我们就以 Attribute 为例,看一下 RequiredModelBean 支持的策略。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章