首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

Tomcat源码分析(7)-单一启动/关闭机制(生命周期)

2012-08-15 
Tomcat源码分析(七)--单一启动/关闭机制(生命周期)在前面的大部分文章都是讲连接器和容器的,以后的内容会

Tomcat源码分析(七)--单一启动/关闭机制(生命周期)

   在前面的大部分文章都是讲连接器和容器的,以后的内容会偏向写一些Tomcat的其他组件以及一些细节的东西。

   Tomcat有很多组件,要一个一个启动组件难免有点麻烦。由于Tomcat的包含关系是Catalina->Server->Service->容器/连接器/日志器等,于是可通过父组件负责启动/关闭它的子组件,这样只要启动Catalina,其他的都自动启动了。这种单一启动和关闭的机制是通过实现Lifecycle接口来实现的。下面是Lifecycle接口的定义:

   public synchronized void start() throws LifecycleException {        // Validate and update our current component state        if (started)            throw new LifecycleException                (sm.getString("containerBase.alreadyStarted", logName()));        // Notify our interested LifecycleListeners        lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);        addDefaultMapper(this.mapperClass);        started = true;        // Start our subordinate components, if any        if ((loader != null) && (loader instanceof Lifecycle)) //启动所有其他的组件            ((Lifecycle) loader).start();        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 Mappers, if any        Mapper mappers[] = findMappers();        for (int i = 0; i < mappers.length; i++) {            if (mappers[i] instanceof Lifecycle)                ((Lifecycle) mappers[i]).start();        }        // Start our child containers, if any        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        if (pipeline instanceof Lifecycle)            ((Lifecycle) pipeline).start();        // Notify our interested LifecycleListeners        lifecycle.fireLifecycleEvent(START_EVENT, null);        // Notify our interested LifecycleListeners        lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);    }

这里代码比较丰富,由它启动了Tomcat其他所有的组件,包括加载器,映射器,日志记录器,管道等等,由这里也可以看出,他们都实现了Lifecycle接口。统一关闭跟统一启动的逻辑差不多,这里就不再说了。至此,我们对Tomcat怎么实现统一启动/关闭应该有一个比较清晰的认识了!


热点排行