tomcat 7 源码分析-5 server初始化中的JMX(DynamicMBean)

本文详细解析了Tomcat7服务器启动过程中JMX组件的初始化流程,重点关注了DynamicMBean的注册过程,并介绍了涉及的关键类如BaseModelMBean、ManagedBean及Registry的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tomcat 7 源码分析-5 server初始化中的JMX(DynamicMBean)

Server的中的初始化基本核心在StandardServer中,下面的代码

Java代码   收藏代码
  1. protected   void  initInternal()  throws  LifecycleException {  
  2.       
  3.     super .initInternal();  
  4.   
  5.     // Register global String cache   
  6.     // Note although the cache is global, if there are multiple Servers   
  7.     // present in the JVM (may happen when embedding) then the same cache   
  8.     // will be registered under multiple names   
  9.     onameStringCache = register(new  StringCache(),  "type=StringCache" );  
  10.   
  11.     // Register the MBeanFactory   
  12.     onameMBeanFactory = register(new  MBeanFactory(),  "type=MBeanFactory" );  
  13.       
  14.     // Register the naming resources   
  15.     onameNamingResoucres = register(globalNamingResources,  
  16.             "type=NamingResources" );  
  17.       
  18.     // Initialize our defined Services   
  19.     for  ( int  i =  0 ; i < services.length; i++) {  
  20.         services[i].init();  
  21.     }  
  22. }  
    protected void initInternal() throws LifecycleException {
        
        super.initInternal();

        // Register global String cache
        // Note although the cache is global, if there are multiple Servers
        // present in the JVM (may happen when embedding) then the same cache
        // will be registered under multiple names
        onameStringCache = register(new StringCache(), "type=StringCache");

        // Register the MBeanFactory
        onameMBeanFactory = register(new MBeanFactory(), "type=MBeanFactory");
        
        // Register the naming resources
        onameNamingResoucres = register(globalNamingResources,
                "type=NamingResources");
        
        // Initialize our defined Services
        for (int i = 0; i < services.length; i++) {
            services[i].init();
        }
    }

 先看super.initInternal();

Java代码   收藏代码
  1. protected   void  initInternal()  throws  LifecycleException {  
  2.       
  3.     // If oname is not null then registration has already happened via   
  4.     // preRegister().   
  5.     if  (oname ==  null ) {  
  6.         mserver = Registry.getRegistry(nullnull ).getMBeanServer();  
  7.           
  8.         oname = register(this , getObjectNameKeyProperties());  
  9.     }  
  10. }  
    protected void initInternal() throws LifecycleException {
        
        // If oname is not null then registration has already happened via
        // preRegister().
        if (oname == null) {
            mserver = Registry.getRegistry(null, null).getMBeanServer();
            
            oname = register(this, getObjectNameKeyProperties());
        }
    }

 看来问题的关键就在register这个函数了。

Java代码   收藏代码
  1. protected   final  ObjectName register(Object obj,  
  2.         String objectNameKeyProperties) {  
  3.       
  4.     // Construct an object name with the right domain   
  5.     StringBuilder name = new  StringBuilder(getDomain());  
  6.     name.append(':' );  
  7.     name.append(objectNameKeyProperties);  
  8.   
  9.     ObjectName on = null ;  
  10.   
  11.     try  {  
  12.         on = new  ObjectName(name.toString());  
  13.           
  14.         Registry.getRegistry(nullnull ).registerComponent(obj, on,  null );  
  15.     } catch  (MalformedObjectNameException e) {  
  16.         log.warn(sm.getString("lifecycleMBeanBase.registerFail" , obj, name),  
  17.                 e);  
  18.     } catch  (Exception e) {  
  19.         log.warn(sm.getString("lifecycleMBeanBase.registerFail" , obj, name),  
  20.                 e);  
  21.     }  
  22.   
  23.     return  on;  
  24. }  
    protected final ObjectName register(Object obj,
            String objectNameKeyProperties) {
        
        // Construct an object name with the right domain
        StringBuilder name = new StringBuilder(getDomain());
        name.append(':');
        name.append(objectNameKeyProperties);

        ObjectName on = null;

        try {
            on = new ObjectName(name.toString());
            
            Registry.getRegistry(null, null).registerComponent(obj, on, null);
        } catch (MalformedObjectNameException e) {
            log.warn(sm.getString("lifecycleMBeanBase.registerFail", obj, name),
                    e);
        } catch (Exception e) {
            log.warn(sm.getString("lifecycleMBeanBase.registerFail", obj, name),
                    e);
        }

        return on;
    }

 接下去看registerComponent函数

Java代码   收藏代码
  1. public   void  registerComponent(Object bean, ObjectName oname, String type)  
  2.           throws  Exception  
  3.    {  
  4.        if ( log.isDebugEnabled() ) {  
  5.            log.debug( "Managed= " + oname);  
  6.        }  
  7.   
  8.        if ( bean == null  ) {  
  9.            log.error("Null component "  + oname );  
  10.            return ;  
  11.        }  
  12.   
  13.        try  {  
  14.            if ( type== null  ) {  
  15.                type=bean.getClass().getName();  
  16.            }  
  17.   
  18.            ManagedBean managed = findManagedBean(bean.getClass(), type);  
  19.   
  20.            // The real mbean is created and registered   
  21.            DynamicMBean mbean = managed.createMBean(bean);  
  22.   
  23.            if (  getMBeanServer().isRegistered( oname )) {  
  24.                if ( log.isDebugEnabled()) {  
  25.                    log.debug("Unregistering existing component "  + oname );  
  26.                }  
  27.                getMBeanServer().unregisterMBean( oname );  
  28.            }  
  29.   
  30.            getMBeanServer().registerMBean( mbean, oname);  
  31.        } catch ( Exception ex) {  
  32.            log.error("Error registering "  + oname, ex );  
  33.            throw  ex;  
  34.        }  
  35.    }  
 public void registerComponent(Object bean, ObjectName oname, String type)
           throws Exception
    {
        if( log.isDebugEnabled() ) {
            log.debug( "Managed= "+ oname);
        }

        if( bean ==null ) {
            log.error("Null component " + oname );
            return;
        }

        try {
            if( type==null ) {
                type=bean.getClass().getName();
            }

            ManagedBean managed = findManagedBean(bean.getClass(), type);

            // The real mbean is created and registered
            DynamicMBean mbean = managed.createMBean(bean);

            if(  getMBeanServer().isRegistered( oname )) {
                if( log.isDebugEnabled()) {
                    log.debug("Unregistering existing component " + oname );
                }
                getMBeanServer().unregisterMBean( oname );
            }

            getMBeanServer().registerMBean( mbean, oname);
        } catch( Exception ex) {
            log.error("Error registering " + oname, ex );
            throw ex;
        }
    }

 终于知道这一段代码要完成什么功能了,原来register就是将参数中的object注册到MBeanServer中去,而且使用的是DynamicMBean。

Tomcat中

BaseModelMBean实现了DynamicMBean接口,是真正意思上的动态Mbeans。

ManagedBean是对MBeans的管理,例如生产Mbean等。

Registry是又一层次的封装,是将Object(Mbeans)注册到MBeanServer的一个接口,同时还提供对已有Mbeans的查找,防止重复注册等。

说到这里,如果不了解MBean的话,肯定不知道在说什么。所以我下一个续,先从简单的Standard MBeans说起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值