這一次將會對tomcat的啟動過程進行乙個分析。
tomcat的入口函式是:org.apache.catalina.startup.main
在這個函式中最關鍵的**段是:
public
static
void
main(string args)
if (command.equals("startd")) else
if (command.equals("stopd")) else
if (command.equals("start")) else
if (command.equals("stop")) else
if (command.equals("configtest"))
system.exit(0);
} else
//......
}
從這裡我們可以看到,當啟動引數為「start」的時候,實際呼叫的是bootstrap.start()函式(daemon是乙個bootstrap類的例項),接下來分析start()函式。
bootstrap.start()函式的**:
public
void
start()
throws exception
可以看出本質上呼叫的是catalinadaemon的start函式,那麼catalinadaemon又是哪個類的例項呢?通過下面這段**可以發現:
public
void
init()throws exception
所以**接下來將會走到org.apache.catalina.startup.catalina.start()中去,
public
void
start()
//......
getserver().start();
//......
if (await)
}
在這裡最關鍵的兩個函式是:
1、load(),配置檔案的載入
2、getserve日().start(),服務的啟動。
還有乙個地方需要注意的地方是await()函式,這個函式實際上是一直在監聽shutdown命令,預設是8005埠,配置檔案中可以設定。
tomcat的配置檔案載入是在org.apache.catalina.startup.catalina.load()函式裡面完成的,**為:
public
void
load()
在start函式中會呼叫getserver().start()函式,就是啟動tomcat服務。通過分析可以知道getserver函式返回的是org.apache.catalina.core.standardserver類的例項。start函式是在其基類org.apache.catalina.util.lifecyclebase中實現的,其關鍵**為:
@override
public
final
synchronized
void
start() throws lifecycleexception
這個函式的本質是呼叫了startinternal函式,在standardserver類中有實現這個函式,其關鍵**為:
@override
protected
void
startinternal() throws lifecycleexception
}}
可以看出,在server的啟動過程中實際上呼叫的是每乙個services的start函式,這裡的services預設都是standardservice的例項,而standardservice也是繼承lifecyclebase的,所以本質上會再呼叫standardservice的startinternal函式,這個函式的關鍵**:
@override
protected
void
startinternal() throws lifecycleexception
}//......
synchronized (executors)
}//......
synchronized (connectors)
} catch (exception e) }}
}
這個函式中主要做了三件事情:
1、呼叫container的start函式,container預設是org.apache.catalina.core.standardengine的例項,它也是繼承lifecyclebase的。
2、呼叫所有的executor的start函式,executor 也是繼承lifecyclebase的。
3、呼叫所有的connector的start函式,connector是org.apache.catalina.connector.connector的例項,它也是繼承lifecyclebase的。
container的start**本質上是執行的containerbase.startinternal函式,其關鍵**為:
@override
protected
synchronized
void
startinternal() throws lifecycleexception
boolean fail = false;
for (futureresult : results) catch (exception e)
}//......
if (pipeline instanceof lifecycle)
((lifecycle) pipeline).start();
setstate(lifecyclestate.starting);
// start our thread
threadstart();
}
在這裡同樣是呼叫了一大堆lifecyclebase例項的start函式進行啟動。
connector的start呼叫的關鍵**:
@override
protected
void
startinternal() throws lifecycleexception
這裡最關鍵的是呼叫了http的handler的start,啟動了乙太網伺服器,等待接收資料,具體的啟動和執行原理將在以後分析。
至此tomcat的啟動過程已經初步分析玩了。
2啟動過程原始碼
目錄 2run 2.1獲取run方法的 eventpublishingrunlistener 2.2準備環境 prepareenvironment 2.4獲取springbootexceptionreporter 2.5準備容器preparecontext 2.6refresh this.resou...
2 TOMCAT學習 TOMCAT的啟動過程
load方法會根據配置檔案載入整個tomcat,將tomcat的所有元件按照設計好的結構裝配起來。整個load的過程中最重要的地方在catalina 中。catalina 的load方法會去解析server.xml檔案並且載入檔案中包含的元件。以上述檔案為例。tomcat解析server.xml的時...
tomcat原始碼閱讀2
abstractcatalinatask ant任務的互動與動態部署和取消部署應用程式管理器的web應用程式抽象基類。baseredirectorhelpertask 對catalina的ant任務新增輸出重定向功能。deploytask ant任務,它實現了 deploy命令,由tomcat的管理...