`
zhaohaolin
  • 浏览: 1012335 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

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(null null ).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(null null ).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说起。

分享到:
评论

相关推荐

    tomcat-catalina-jmx-remote-9.0.5.jar

    tomcat-catalina-jmx-remote-9.0.5 tomcat-catalina-jmx-remote-9.0.5.jar

    tomcat7源码下载

    3. common:这个模块包含了Tomcat中可被所有其他模块共享的组件和服务,如Logging、Naming和JMX支持。 4. jasper:Jasper是Tomcat的JSP编译器,负责将JSP页面转换为Servlet Java代码。 5. shared:共享库,提供...

    官方原版apache-tomcat-10.0.0-M1-windows-x64.zip 64位

    - **JMX监控**: 可以启用JMX(Java Management Extensions)进行远程监控和管理,配置在`server.xml`中的`&lt;Connector&gt;`元素内。 总结起来,Apache Tomcat 10.0.0-M1是一个用于运行Java Web应用的高效服务器,特别...

    Tomcat-6-Windows-x86+Tomcat-7-Windows-x64+Tomcat-8-Windows-x64

    在本压缩包中,包含了三个不同版本的Tomcat,分别是Tomcat 6、Tomcat 7和Tomcat 8,分别适用于Windows x86和x64架构。以下将详细讲解这三个版本以及它们在Windows环境下的安装和使用。 1. **Tomcat 6** - **概述**...

    apache-tomcat-7.0.62-src和apache-tomcat-6.0.39-src的源码

    首先,让我们从Apache Tomcat 6.0.39源码开始分析。这个版本是Tomcat 6系列的一个稳定版本,它主要支持Java EE 5规范。在这个版本中,你可以深入学习以下关键知识点: 1. **Servlet 2.5规范**:Tomcat 6是基于...

    apache-tomcat-11.0.0-M17-windows-x64.zip

    Apache Tomcat 是一款广泛应用的开源软件,主要用于部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。在本文中,我们将深入探讨Apache Tomcat 11.0.0-M17这一版本,它是针对Windows 64位操作系统的。这个...

    tomcat7-tomcat-7.0.19.zip

    1. Servlet容器:Tomcat作为Servlet容器,负责加载、初始化、运行Servlet,处理来自客户端的HTTP请求,并将响应返回给客户端。 2. JSP支持:Tomcat能动态编译JSP文件为Servlet,使得开发者可以使用动态网页技术编写...

    apache-tomcat-8.0.44-windows-x64

    Apache Tomcat 是一款广泛应用的开源软件,主要用于部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。在本文中,我们将深入探讨“apache-tomcat-8.0.44-windows-x64”这一特定版本,它专为64位Windows操作...

    apache-tomcat-9.0.78-windows-x64

    Apache Tomcat 9.0.78 是一个广泛使用的开源软件,它是一个实现了Java Servlet、JavaServer Pages(JSP)和Java EE的Web应用程序容器。这个版本是专门为Windows x64平台设计的,确保在64位操作系统上的高效运行。在...

    apache-tomcat-8.5.9-windows-x64

    Apache Tomcat 8.5.9 是一个广泛应用的开源软件,用作Java Servlet和JavaServer Pages(JSP)的Web应用程序服务器,特别是针对轻量级和中型项目。Tomcat是Apache软件基金会Jakarta项目的一部分,它实现了Java EE的...

    最新版windows apache-tomcat-10.0.0-windows-x64.zip

    Apache Tomcat是一款开源的Java应用服务器,主要用于运行Java Servlet和JavaServer Pages(JSP)应用程序。这个最新的Windows版本,即apache-tomcat-10.0.0-windows-x64.zip,是专为64位Windows操作系统设计的,提供...

    apache-tomcat-8.5.64-windows-x64.zip

    7. **JMX(Java Management Extensions)**:Tomcat 8.5支持JMX,允许远程监控和管理服务器状态,这对于运维人员监控和优化服务器性能非常有用。 8. **性能优化**:可以通过调整`server.xml`中的线程池设置、启用...

    apache-tomcat-源码-lib包

    在Tomcat中,Servlet负责接收来自客户端的请求,进行业务逻辑处理,然后返回响应。lib包中的servlet-api.jar包含了Servlet API,这是开发Servlet所必需的。 2. **HTTP链接**:Tomcat作为HTTP服务器,处理HTTP请求和...

    apache-tomcat-9.0.8-src源码资源

    它的源码资源对于我们理解Tomcat的工作原理、进行定制开发或者优化性能都具有极大的价值。`apache-tomcat-9.0.8-src`这个压缩包包含了Tomcat 9.0.8版本的完整源代码,这是学习和研究Tomcat的绝佳材料。 1. **Tomcat...

    jmx监控weblogic,tomcat,websphere源码

    在本项目中,"jmx监控weblogic,tomcat,websphere源码"涉及了使用JMX来监控三个主流的Java应用服务器:WebLogic、Tomcat和WebSphere。这些服务器都是企业级应用部署的常见选择,对它们的监控对于确保系统性能、稳定性...

    apache-tomcat-7.0.85-windows-x64

    - **JMX监控**:通过JMX(Java Management Extensions)可以远程监控Tomcat的运行状态。 综上,Apache Tomcat 7.0.85 64位版本提供了一个强大的平台来运行和部署Java Web应用,其稳定性和性能都经过了广泛测试,是...

    apache-tomcat-7.0.79.zip

    8. **JMX(Java Management Extensions)支持**:Tomcat支持JMX,允许通过JMX管理工具监控和管理Tomcat实例,如调整配置、查看运行状态、收集性能指标等。 9. **集群与负载均衡**:Tomcat支持集群配置,可以创建多...

    tomcat 7 及其源码

    这个版本7.0.42是Tomcat 7的一个稳定版本,提供了对Java Servlet 3.0和JavaServer Pages (JSP) 2.2规范的支持。下面将详细介绍Tomcat 7及其源码的相关知识点。 1. **Tomcat结构与组件**: - **Catalina**:核心...

    apache-tomcat-7.0.82-windows-x86

    5. **安装Tomcat 7.0.82**:下载解压Apache Tomcat 7.0.82后,将解压文件夹放在合适的位置,例如C:\Program Files。配置环境变量`CATALINA_HOME`指向Tomcat的根目录。 6. **启动与停止Tomcat**:在bin目录下,通过...

    apache-tomcat-8.5.16.tar.gz

    Apache Tomcat是一个开源的软件应用服务器,主要用于部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。在本文中,我们将深入探讨Apache Tomcat 8.5.16版本的相关知识点,包括其功能、安装与配置、管理以及...

Global site tag (gtag.js) - Google Analytics