Tomcat学习笔记之启动分析(Service)(五)

前言

通过上面一篇的介绍,我们开始分析Service的启动过程。

initInternal()方法

protected void initInternal() throws LifecycleException {
        super.initInternal();
        //1. 初始化engine容器
        if (engine != null) {
            engine.init();
        }
        // 2. 初始化线程池
        for (Executor executor : findExecutors()) {
            if (executor instanceof JmxEnabled) {
                ((JmxEnabled) executor).setDomain(getDomain());
            }
            executor.init();
        }
        //3. 初始化mapperListener
        mapperListener.init();
        //4. 初始化connectors
        synchronized (connectorsLock) {
            for (Connector connector : connectors) {
                connector.init();
            }
        }
    }

流程比较清晰,不做详细介绍。这里看下几个初始化的容器:

  1. Engine
    Engine容器表示一个特定的Service的请求处理流水线。每个Service只能包含一个,一个Service可以有多个连接器(Connector),Engine从连接器接收和处理所有的请求,将响应返回给适合的连接器,通过连接器传输给用户。
    Engine容器包含Host,Host包含Context,Context包含Wrapper,而它们都属于Container容器。
    由于后面会专门介绍,这里仅做了解。
  2. Executor
    Service中有一个属性executors,从service.xml读取,所以我们可以从service.xml看到:
 

默认是注释掉的,所以我们这里也不做介绍。

  1. MapperListener
    MapperListener主要作用如下:
    通过监听容器的AFTER_START_EVENT事件来对容器进行注册;
    通过监听容器的BEFORE_STOP_EVENT事件来完成对容器的取消注册。
    与MapperListener对应出现的还有Mapper,而Mapper作为uri映射到容器的工具,扮演的角色就是一个映射组件。它会缓存所有容器信息(包括容器名称、容器本身、容器层级等等),同时提供映射规则,将一个uri按照映射规则映射到具体的Host、Context和Wrapper,并最终通过Wrapper找到逻辑处理单元Servlet。

  2. Connectors
    上面也提到过,作为Tomcat重要的一部分,连接器。用来接受用户的请求,后面会分析。

startInternal()方法

protected void startInternal() throws LifecycleException {

        if(log.isInfoEnabled())
            log.info(sm.getString("standardService.start.name", this.name));
        //1. 设置状态,并发送通知
        setState(LifecycleState.STARTING);

        //2. 启动engine容器
        if (engine != null) {
            synchronized (engine) {
                engine.start();
            }
        }
        //2. 启动线程池
        synchronized (executors) {
            for (Executor executor: executors) {
                executor.start();
            }
        }
        //3. 启动mapperListener
        mapperListener.start();

        //4. 启动连接器
        synchronized (connectorsLock) {
            for (Connector connector: connectors) {
                // If it has already failed, don't try and start it
                if (connector.getState() != LifecycleState.FAILED) {
                    connector.start();
                }
            }
        }
    }

主要流程如下:

  • 启动Engine容器;
  • 启动线程池;
  • 启动MapperListener;
  • 启动连接器Connector。

总结

到这里,Server->Service全部启动完成,下面主要来分析两大组件,Connector连接器和Container容器。

你可能感兴趣的:(Tomcat学习笔记之启动分析(Service)(五))