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()

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

相关推荐