`
wu_quanyin
  • 浏览: 208150 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

Tomcat源码---容器启动六(2)

阅读更多

  super.start()--->org.apache.catalina.core.ContainerBase#start()

 

/**
     * Prepare for active use of the public methods of this Component.
     *
     * @exception LifecycleException if this component detects a fatal error
     *  that prevents it from being started
     */
    public synchronized void start() throws LifecycleException {

        // Validate and update our current component state
        if (started) {
            if(log.isInfoEnabled())
                log.info(sm.getString("containerBase.alreadyStarted", logName()));
            return;
        }
        
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);

        started = true;
	
   	//这些为server.xml中配置应用组件的启动,如果要了解的话
	//可根据自己的配置进行查看
        // Start our subordinate components, if any
        if ((loader != null) && (loader instanceof Lifecycle))
            ((Lifecycle) loader).start();
        logger = null;
        getLogger();
        if ((logger != null) && (logger instanceof Lifecycle))
            ((Lifecycle) logger).start();
        if ((manager != null) && (manager instanceof Lifecycle))
            ((Lifecycle) manager).start();
        if ((cluster != null) && (cluster instanceof Lifecycle))
            ((Lifecycle) cluster).start();
        if ((realm != null) && (realm instanceof Lifecycle))
            ((Lifecycle) realm).start();
        if ((resources != null) && (resources instanceof Lifecycle))
            ((Lifecycle) resources).start();

        // Start our child containers, if any
 	//StandardHost容器的启动,
        Container children[] = findChildren();
        for (int i = 0; i < children.length; i++) {
            if (children[i] instanceof Lifecycle)
                ((Lifecycle) children[i]).start();
        }

        // Start the Valves in our pipeline (including the basic), if any
 	//StandardPipeline的启动(容器与容器间的管道)
        if (pipeline instanceof Lifecycle)
            ((Lifecycle) pipeline).start();

        // Notify our interested LifecycleListeners(里面将会对HostConfig进行启动,并且部暑webapps)
        lifecycle.fireLifecycleEvent(START_EVENT, null);

        // Start our thread
        threadStart();

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);

    }

  StandardHost#start

  /**

     * Start this host.
     *
     * @exception LifecycleException if this component detects a fatal error
     *  that prevents it from being started
     */
    public synchronized void start() throws LifecycleException {
        if( started ) {
            return;
        }
        if( ! initialized )
            init();

        // Look for a realm - that may have been configured earlier. 
        // If the realm is added after context - it'll set itself.
        if( realm == null ) {
            ObjectName realmName=null;
            try {
                realmName=new ObjectName( domain + ":type=Realm,host=" + getName());
                if( mserver.isRegistered(realmName ) ) {
                    mserver.invoke(realmName, "init", 
                            new Object[] {},
                            new String[] {}
                    );            
                }
            } catch( Throwable t ) {
                log.debug("No realm for this host " + realmName);
            }
        }
            
        // Set error report valve
        if ((errorReportValveClass != null)
            && (!errorReportValveClass.equals(""))) {
            try {
                boolean found = false;
                if(errorReportValveObjectName != null) {
                    ObjectName[] names = 
                        ((StandardPipeline)pipeline).getValveObjectNames();
                    for (int i=0; !found && i<names.length; i++)
                        if(errorReportValveObjectName.equals(names[i]))
                            found = true ;
                    }
                    if(!found) { 
			//添加阀门,在接收消息时,进行过滤消息         	
                        Valve valve = (Valve) Class.forName(errorReportValveClass)
                        .newInstance();
                        addValve(valve);
                        errorReportValveObjectName = ((ValveBase)valve).getObjectName() ;
                    }
            } catch (Throwable t) {
                log.error(sm.getString
                    ("standardHost.invalidErrorReportValveClass", 
                     errorReportValveClass), t);
            }
        }
        if(log.isDebugEnabled()) {
            if (xmlValidation)
                log.debug(sm.getString("standardHost.validationEnabled"));
            else
                log.debug(sm.getString("standardHost.validationDisabled"));
        }
 	//返回到以上的containerBase#start执行pipeline
	//pipeline是容器与容器间的桥梁(管道),在每一个容器中执行这一步,都为自己的容器添加相应的valve
        super.start();

    }

 StandardPipeline#start

 

 /**
     * Prepare for active use of the public methods of this Component.
     *
     * @exception LifecycleException if this component detects a fatal error
     *  that prevents it from being started
     */
    public synchronized void start() throws LifecycleException {

        // Validate and update our current component state
        if (started)
            throw new LifecycleException
                (sm.getString("standardPipeline.alreadyStarted"));

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);

        started = true;

        // Start the Valves in our pipeline (including the basic), if any
        Valve current = first;
        if (current == null) {
        	current = basic;
        }
        while (current != null) {
            //ErrorReportValve StandardHostValve两个阀门
            if (current instanceof Lifecycle)
                ((Lifecycle) current).start();
	    //注册阀门,
            registerValve(current);
        	current = current.getNext();
        }

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(START_EVENT, null);

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);

    }

   HostConfig#lifecycleEvent方法下的start方法

 

  /**
     * Process a "start" event for this Host.
     */
    public void start() {

        if (log.isDebugEnabled())
            log.debug(sm.getString("hostConfig.start"));

        try {
            ObjectName hostON = new ObjectName(host.getObjectName());
            oname = new ObjectName
                (hostON.getDomain() + ":type=Deployer,host=" + host.getName());
            Registry.getRegistry(null, null).registerComponent
                (this, oname, this.getClass().getName());
        } catch (Exception e) {
            log.error(sm.getString("hostConfig.jmx.register", oname), e);
        }
        //StandardHost判断
        if (host.getDeployOnStartup())
            //部暑webapps
            deployApps();
        
    }

 HostConfig#deployApps

 

 /**
     * Deploy applications for any directories or WAR files that are found
     * in our "application root" directory.
     */
    protected void deployApps() {
	//webapps,以下方法见名知义
        File appBase = appBase();
        File configBase = configBase();
        // Deploy XML descriptors from configBase
        deployDescriptors(configBase, configBase.list());
        // Deploy WARs, and loop if additional descriptors are found
        deployWARs(appBase, appBase.list());
        // Deploy expanded folders
        deployDirectories(appBase, appBase.list());
        
    }
0
1
分享到:
评论

相关推荐

    apache-tomcat-7.0.81-src 源码免费下载

    Apache Tomcat 7.0.81 源码分析 Apache Tomcat 是一个流行的开源软件,用Java语言编写,是实现Java Servlet和JavaServer Pages(JSP)规范的应用服务器,广泛用于Web应用的开发和部署。源码的下载对于开发者来说...

    apache-tomcat-6.0.35和apache-tomcat-6.0.35 src

    Apache Tomcat是一款开源的Java Servlet容器,主要用于实现JavaServer Pages (JSP)、Servlet和Java EE的Web应用程序。在这个压缩包中,包含了两个版本:`apache-tomcat-6.0.35` 和 `apache-tomcat-6.0.35 src`。前者...

    apache-tomcat-9.0.8-src源码资源

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

    Tomcat源码apache-tomcat-8.5.47-src.zip

    在开始学习Tomcat源码之前,首先需要了解一些基本概念。Java Servlet是Java平台上的一个标准接口,用于处理HTTP请求。而JSP则是用于创建动态网页的Java技术,它将业务逻辑和页面展示分离。Tomcat作为Servlet容器,...

    Ant编译Tomcat源码、MyEclipse导入Tomcat源码、执行Tomcat源码启动Tomcat

    本篇将详细介绍如何使用Ant编译Tomcat源码,以及如何在MyEclipse环境中导入并运行Tomcat源码。 首先,Ant是Apache软件基金会开发的Java项目自动化构建工具,它能够执行编译、测试、打包等任务。在Apache Tomcat的...

    apache-tomcat-6.0.29.zip

    在本压缩包"apache-tomcat-6.0.29.zip"中,包含的是Apache Tomcat 6.0.29版本的源码、配置文件、库文件以及相关的文档资料。 Tomcat 6.0.29是Apache Tomcat的一个稳定版本,发布于2010年,支持Java EE 5规范。以下...

    apache-tomcat-9.0.14-src源码

    对于初次接触Tomcat源码的开发者,可以从阅读`src/main/java`目录下的源码开始,重点关注`org.apache.catalina`包下的类,以及`org.apache.coyote`和`org.apache.jasper`等包。同时,`conf/server.xml`是配置整个...

    apache-tomcat-7.0.59,apache-tomcat-7.0.69 源码

    源码中,`catalina`目录包含了服务器启动、配置加载、容器管理、生命周期管理和请求处理的相关代码。`org.apache.catalina`包下的类是Catalina的核心,如`Engine`、`Host`、`Context`和`Wrapper`,它们代表了不同...

    tomcat7.0.42源码,eclipse直接使用

    Eclipse是一个广泛使用的Java集成开发环境(IDE),它支持直接导入和管理Tomcat源码。在Eclipse中,开发者可以通过导入“Existing Projects into Workspace”来加载Tomcat源码。然后,可以利用Eclipse的强大功能,如...

    apache-tomcat-6.0.37

    2. **启动与停止**:使用bin目录下的startup.sh(Unix/Linux)或startup.bat(Windows)脚本来启动Tomcat,shutdown.sh或shutdown.bat则用于关闭服务。 3. **部署应用**:应用程序通常以WAR(Web ARchive)文件的...

    apache-tomcat-7.0.39-src

    Apache Tomcat 7.0.39 是一个广泛使用的开源软件,它是一个实现了Java Servlet、JavaServer Pages(JSP)和Java EE的Web应用程序容器。Tomcat作为一个轻量级的应用服务器,尤其适合运行简单的Java Web应用。以下是...

    tomcat8源码-eclipse工程

    7. **Eclipse集成**:在Eclipse中导入Tomcat源码,可以方便地进行调试、代码分析和自定义修改。这需要配置Tomcat插件,设置源代码路径,以及正确配置项目的构建路径。 8. **部署与调试**:在Eclipse中如何部署Web...

    tomcat-7.0.42-src源码爱好者(已编译导入直接可用)

    通过研究Tomcat源码,开发者可以了解到HTTP请求的处理流程、Servlet容器的工作方式、以及如何高效地管理Web应用。此外,了解Tomcat源码还可以帮助开发者借鉴其设计模式和架构,以便在日常开发中构建更稳定、高效的...

    tomcat-7.0.90-src-源码

    深入Tomcat源码,我们可以学习到以下关键知识点: 1. **Web应用部署**:Tomcat如何解析`WEB-INF/web.xml`配置文件,加载Servlet和Filter,以及如何根据`META-INF/context.xml`设置上下文参数。 2. **生命周期管理*...

    apache-tomcat-9.0.8-src可直接导入eclipse的源码

    了解并分析Tomcat源码对于深入理解Java Web应用的部署和执行机制非常有帮助。 源码包"apache-tomcat-9.0.8-src"包含了Tomcat的所有源代码,包括核心组件、模块和服务。它由多个子目录构成,每个目录对应Tomcat的...

    apache-tomcat-9.0.34-src.zip

    2. **bin**:这个目录包含运行和管理Tomcat的各种脚本,如启动、停止、重启和监控Tomcat的命令。 3. **conf**:这里存放着Tomcat的配置文件,例如`server.xml`、`context.xml`、`web.xml`等,它们定义了服务器的行为...

    linux -win 源码apache-tomcat-8.5.78

    Apache Tomcat 8.5.78 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的容器。它实现了Java EE的Web应用程序部分,即Servlet和JSP规范,允许开发者构建和部署动态Web应用。在这个源码...

    apache-tomcat-8.5.9-src

    2. Servlet 容器:Catalina 是Tomcat的核心,负责管理Servlet容器,处理请求和响应。它遵循Servlet规范,提供对Servlet的生命周期管理和调度。 3. JSP 支持:Jasper 负责将JSP文件转换为Servlet类并编译。它实现了...

    tomcat8-redis-session共享

    如果还没有,可以下载Redis源码编译安装,或者使用Docker等容器化工具快速启动。 2. **添加依赖**:在Tomcat的`lib`目录下,添加与Redis相关的Java库,例如`spring-session-data-redis`或`jedis`。压缩包中的jar...

    tomcat8源码

    Apache Tomcat 8.5.23 源码分析 Apache Tomcat 是一个开源的、免费的Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,...因此,对Tomcat源码的学习对于Java Web开发者来说是至关重要的。

Global site tag (gtag.js) - Google Analytics