前言
通过上面一篇的介绍,我们开始分析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();
}
}
}
流程比较清晰,不做详细介绍。这里看下几个初始化的容器:
- Engine
Engine容器表示一个特定的Service的请求处理流水线。每个Service只能包含一个,一个Service可以有多个连接器(Connector),Engine从连接器接收和处理所有的请求,将响应返回给适合的连接器,通过连接器传输给用户。
Engine容器包含Host,Host包含Context,Context包含Wrapper,而它们都属于Container容器。
由于后面会专门介绍,这里仅做了解。 - Executor
Service中有一个属性executors,从service.xml读取,所以我们可以从service.xml看到:
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
默认是注释掉的,所以我们这里也不做介绍。
MapperListener
MapperListener主要作用如下:
通过监听容器的AFTER_START_EVENT事件来对容器进行注册;
通过监听容器的BEFORE_STOP_EVENT事件来完成对容器的取消注册。
与MapperListener对应出现的还有Mapper,而Mapper作为uri映射到容器的工具,扮演的角色就是一个映射组件。它会缓存所有容器信息(包括容器名称、容器本身、容器层级等等),同时提供映射规则,将一个uri按照映射规则映射到具体的Host、Context和Wrapper,并最终通过Wrapper找到逻辑处理单元Servlet。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容器。