前言
通過上面一篇的介紹,我們開始分析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();
}
}
}
流程比較清晰,不做詳細(xì)介紹。這里看下幾個初始化的容器:
- Engine
Engine容器表示一個特定的Service的請求處理流水線。每個Service只能包含一個,一個Service可以有多個連接器(Connector),Engine從連接器接收和處理所有的請求,將響應(yīng)返回給適合的連接器,通過連接器傳輸給用戶。
Engine容器包含Host,Host包含Context,Context包含Wrapper,而它們都屬于Container容器。
由于后面會專門介紹,這里僅做了解。 - Executor
Service中有一個屬性executors,從service.xml讀取,所以我們可以從service.xml看到:
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
默認(rèn)是注釋掉的,所以我們這里也不做介紹。
MapperListener
MapperListener主要作用如下:
通過監(jiān)聽容器的AFTER_START_EVENT事件來對容器進(jìn)行注冊;
通過監(jiān)聽容器的BEFORE_STOP_EVENT事件來完成對容器的取消注冊。
與MapperListener對應(yīng)出現(xiàn)的還有Mapper,而Mapper作為uri映射到容器的工具,扮演的角色就是一個映射組件。它會緩存所有容器信息(包括容器名稱、容器本身、容器層級等等),同時提供映射規(guī)則,將一個uri按照映射規(guī)則映射到具體的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. 設(shè)置狀態(tài),并發(fā)送通知
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。
總結(jié)
到這里,Server->Service全部啟動完成,下面主要來分析兩大組件,Connector連接器和Container容器。