tomcat解析(十)StandardService.initialize.start

先上代碼:
一.initialize
 

主要的內容有三部分:
1.Registry.getRegistry(null, null).registerComponent(executors[i], executorObjectName, null);
 使用MBean註冊組件
2.ServerFactory.getServer().addService(this);
 ServerFactory.getServer()返回的對象爲StandardServer對象,而在實例化StandardService時已經調用了該方法進行設置了,因此這裏其它是做多了一次設置
3.connectors[i].initialize();
 分別調用所有connectors的initialize()方法,該方法如下:
 

可看到實例化了adapter對象後,最終調用了protocolHandler.init(),其中protocolHandler對象實例化過程如下:
 

因此這裏將調用的是Http11Protocol的方法 ,我們再看Http11Protocol.init到底做了什麼事
  

    前一部分是在設置endpoint對象的屬性,最後調用其Init方法,如下:
     

    最終產生了一個ServerSocket對象,雖然有ServerSocket,但還需要執行其accept()才能獲取客戶端請求的,因此這裏其實還不能處理請求.
二.start
 

主要的內容有二部分:
1.lifecycle.fireLifecycleEvent
 觸發Lifecycle事件,這裏沒有註冊相應的監聽器
2.((Lifecycle) container).start();executors.get(i).start();((Lifecycle) connectors[i]).start();
調用了幾元素的start方法

這裏的container,executors及connectors從何而來呢?
1.executors是需要在server.xml裏配置Server/Service/Executor的,如果進行了配置,將產生類型爲org.apache.catalina.core.StandardThreadExecutor的對象,並全部放入StandardService的ArrayList<Executor> executors裏
2.connectors與executors一樣,也要進行配置,路徑爲Server/Service/Connector,對象類型爲:org.apache.catalina.connector.Connector
3.container則需要查看Catalina.createStartDigester裏的內容,有一句代碼如下:
 digester.addRuleSet(new EngineRuleSet("Server/Service/"));
查看EngineRuleSet對象addRuleInstances方法,可看到將添加ObjectCreateRule創建類型爲org.apache.catalina.core.StandardEngine的對象,並調用StandardService.setContainer,對象將放入StandardService的container變量裏,同時放入Connector的container變量,而該StandardService對象將放入StandardEngine的service變量裏,因此這裏將調用StandardEngine.start();
這裏需要注意的是container.start的調用是在Connector之前的,這樣做是有理由的;container.start()裏將會爲服務器準備所有工程項目的解析及部署工作,而Connector.start()將會讓tomcat開始接受並處理用戶的請求,因此是需要放在工程部署準備完成之後的,因此Connector.start()我們將放在最後來講,下一篇目我們講的是StandardEngine

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章