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

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

阅读更多

 

一,完成了以上的初始化工作,现在进行容器的启动工作由

-------------------------------------------------------------------------------------

 

c) Catalina.start()

c1) Starts the NamingContext and binds all JNDI references into it

c2) Starts the services under <Server> which are:

StandardService -> starts Engine (ContainerBase ->Logger,Loader,Realm,Cluster etc)

c3) StandardHost (started by the service)

Configures a ErrorReportValvem to do proper HTML output for different HTTP 

errors codes

Starts the Valves in the pipeline (at least the ErrorReportValve)

Configures the StandardHostValve, 

this valves ties the Webapp Class loader to the thread context

it also finds the session for the request

and invokes the context pipeline

Starts the HostConfig component

This component deploys all the webapps

(webapps & conf/Catalina/localhost/*.xml)

Webapps are installed using the deployer (StandardHostDeployer)

The deployer will create a Digester for your context, this digester

will then invoke ContextConfig.start()

The ContextConfig.start() will process the default web.xml (conf/web.xml)

and then process the applications web.xml (WEB-INF/web.xml)

c4) During the lifetime of the container (StandardEngine) there is a background thread that 

   keeps checking if the context has changed. If a context changes (timestamp of war file, 

   context xml file, web.xml) then a reload is issued (stop/remove/deploy/start)


-------------------------------------------------------------------------------------

org.apache.catalina.startup.Bootstrap#main

 

else if (command.equals("start")) {
                daemon.setAwait(true);
                daemon.load(args);
              //开始启动  
              daemon.start();
}

  /**

     * Start the Catalina daemon.
     */
    public void start()
        throws Exception {
        if( catalinaDaemon==null ) init();
 
       //开始调用Catalina类里面的start方法
        Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
        method.invoke(catalinaDaemon, (Object [])null);

    }

  ..Catalina#start

 

   /**
     * Start a new server instance.
     */
    public void start() {

        if (server == null) {
            load();
        }

        long t1 = System.nanoTime();
        
        // Start the new server
        //进入server的启动工作
        if (server instanceof Lifecycle) {
            try {
                ((Lifecycle) server).start();
            } catch (LifecycleException e) {
                log.error("Catalina.start: ", e);
            }
        }

        long t2 = System.nanoTime();
        if(log.isInfoEnabled())
            log.info("Server startup in " + ((t2 - t1) / 1000000) + " ms");

        try {
            // Register shutdown hook
            if (useShutdownHook) {
                if (shutdownHook == null) {
                    shutdownHook = new CatalinaShutdownHook();
                }
                Runtime.getRuntime().addShutdownHook(shutdownHook);
            }
        } catch (Throwable t) {
            // This will fail on JDK 1.2. Ignoring, as Tomcat can run
            // fine without the shutdown hook.
        }

        if (await) {
            await();
            stop();
        }

    }

   ->StandardServer#start

public void start() throws LifecycleException {

        // Validate and update our current component state
        if (started) {
            log.debug(sm.getString("standardServer.start.started"));
            return;
        }

        // Notify our interested LifecycleListeners
        //启动之前
        lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
        //启动中
        lifecycle.fireLifecycleEvent(START_EVENT, null);
        started = true;

        // Start our defined Services
        //进入service的启动
        synchronized (services) {
            for (int i = 0; i < services.length; i++) {
                if (services[i] instanceof Lifecycle)
                    ((Lifecycle) services[i]).start();
            }
        }

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

    }

   StandardService#start

 public void start() throws LifecycleException {

        // Validate and update our current component state
        if (log.isInfoEnabled() && started) {
            log.info(sm.getString("standardService.start.started"));
        }
        
        if( ! initialized )
            init(); 

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
        if(log.isInfoEnabled())
            log.info(sm.getString("standardService.start.name", this.name));
        lifecycle.fireLifecycleEvent(START_EVENT, null);
        started = true;

        // Start our defined Container first
        //进入standardEngine的启动
        if (container != null) {
            synchronized (container) {
                if (container instanceof Lifecycle) {
                    ((Lifecycle) container).start();
                }
            }
        }
	//线程池的启动
        synchronized (executors) {
            for ( int i=0; i<executors.size(); i++ ) {
                executors.get(i).start();
            }
        }

        // Start our defined Connectors second
        //两个connector的启动8080 8009
        synchronized (connectors) {
            for (int i = 0; i < connectors.length; i++) {
                if (connectors[i] instanceof Lifecycle)
                    ((Lifecycle) connectors[i]).start();
            }
        }
        
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);

    }

  ->StandardEngine#start

 

 public void start() throws LifecycleException {
        if( started ) {
            return;
        }
        if( !initialized ) {
	//进行一些加入jmx管理等
            init();
        }

        // Look for a realm - that may have been configured earlier. 
        // If the realm is added after context - it'll set itself.
        //表示存放用户名,密码及role的数据库
        if( realm == null ) {
            ObjectName realmName=null;
            try {
                realmName=new ObjectName( domain + ":type=Realm");
                if( mserver.isRegistered(realmName ) ) {
                    mserver.invoke(realmName, "init", 
                            new Object[] {},
                            new String[] {}
                    );            
                }
            } catch( Throwable t ) {
                log.debug("No realm for this engine " + realmName);
            }
        }
            
        // Log our server identification information
        //System.out.println(ServerInfo.getServerInfo());
        if(log.isInfoEnabled())
            log.info( "Starting Servlet Engine: " + ServerInfo.getServerInfo());
        if( mbeans != null ) {
            try {
                Registry.getRegistry(null, null)
                    .invoke(mbeans, "start", false);
            } catch (Exception e) {
                log.error("Error in start() for " + mbeansFile, e);
            }
        }

        // Standard container startup
       //进行logger,manager,cluster,realm,resource的启动
        super.start();

    }
    

 

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

 进行其他一些组件的启动工作,,,看下一章节....

0
0
分享到:
评论

相关推荐

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

    1. **Servlet容器**:Tomcat作为Servlet容器,其核心是Catalina组件,负责处理HTTP请求并调用相应的Servlet。源码中的`catalina`目录包含了这部分内容,你可以看到如何解析请求、创建响应以及管理Servlet实例。 2. ...

    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源码资源

    1. **Tomcat结构**: Tomcat的源码主要分为以下几个关键部分: - `common`:包含所有版本的Tomcat都可以使用的通用组件。 - `catalina`:核心服务组件,处理请求和响应,实现Servlet容器的主要功能。 - `conf`:...

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

    1. **Catalina**:这是Tomcat的核心组件,负责管理Web应用程序,包括加载、部署、启动和停止应用。`org.apache.catalina`包下包含了大部分核心类,如`Engine`(顶层容器)、`Host`(虚拟主机)、`Context`(Web应用...

    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)文件的...

    tomcat8源码-eclipse工程

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

    apache-tomcat-7.0.39-src

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

    Apache Tomcat是一个开源的Java Servlet容器,主要用于实现JavaServer Pages (JSP)、Java Servlet以及Java EE的Web应用程序。在本例中,我们讨论的是Apache Tomcat 9.0.34的源代码版本,即"apache-tomcat-9.0.34-src...

    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

    1. `bin`:包含了启动和停止Tomcat的脚本。 2. `conf`:存放服务器配置文件,如server.xml,定义了服务器的各个组件及其关系。 3. `webapps`:默认的Web应用程序部署目录。 4. `work`:存放编译后的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