Tomcat版本tomcat6.0.44
觀察catalina.sh檔案,啟動入口:org.apache.catalina.startup.Bootstrap,
該類main方法執行下面三個方法
-------------------------------------------------
init() load() start()
得到Catalina例項 | |
| |
| |
| |
| |
catalina.java | |
-----------------------↓---------------------↓-------------
load() start() Catalina的load()方法:
| | a、呼叫initDirs和initNaming()做tmp路徑和命名的初始化。
| | b、呼叫 createStartDigester();生成Digester物件。Digester類負責進行配置檔案的解析。
| | c、載入配置檔案(server.xml),獲取輸入流InputStream物件
| | d、利用Digester解析配置檔案輸入流,解析之後,獲取配置的root節點表示物件,也就是Server物件。
| | e、對上一步生成的server物件進行初始化,呼叫initialize()啟動
standServer.java | |
-----------------------↓---------------------↓-------------
initialize() start() Server遍歷下屬的多個Service,呼叫每一個server的initialize()/start()
| |
| |
| |
| |
standService.java | |
-----------------------↓---------------------↓-------------
initialize() start()
| |
| |
| |
| |
connector.java | |
-----------------------↓---------------------↓-------------
initialize() container.start()------>容器Engine.start(),先不關注
| executor.start()------->執行緒池執行器初始化,該執行緒做什麼用?
| connector.start()------>遍歷所有的下屬connector,並分別start(),重點分析
| |
| | Connector的initialize()方法:
| | a、protocolHander.setAdapter(new CoyoteAdapter(this))
| | b、呼叫protocolHander的init()方法
| |
| |
Http11NioProtocol.java |
-----------------------↓---------------------↓-------------
init() start()
| | HTTP1ApiProtocol的init()方法:
| | a、ep.sethander(Http11ConnectionHandler)
| | b、呼叫ep的init
NioEndpoint.java | |
-----------------------↓---------------------↓-------------
init() start()
NioEndpoint.init() { ServerSocketChannel serverSock = ServerSocketChannel.open(); //server通道初始化 serverSock.socket().bind(addr,backlog); //繫結地址,開始進行監聽accecpt事件 NioSelectorPool selectorPool.open();//選擇器池初始化 …… } NioEndpoint.start() { //初始化處理執行緒池,該執行緒用來處理資料請求 executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), 60, TimeUnit.SECONDS,taskqueue, tf); //初始化poller後臺執行緒組 for() { Thread pollerThread = new Thread(pollers[i], getName() + "-ClientPoller-"+i); pollerThread.start(); } //初始化acceptor後臺執行緒組 for() { Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i); acceptorThread.start(); } …… }