tomcat原始碼學習2 啟動過程

2021-07-06 08:03:49 字數 3364 閱讀 4261

這一次將會對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的管理...