日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 啟動流程分析
  • Pre
  • Star階段
    • start總覽
    • start源碼分析
      • StandardServer Start
      • StandardService Start
        • StandardEngine Start
        • Connector Start
  • 小結


啟動流程分析


Pre

Tomcat - Tomcat 8.5.55 啟動過程源碼分析階段二_load加載初始化

說完了load階段,這里我們繼續來看下最后一個start階段


Star階段

start總覽

你會發現和 load階段非常相似

這里我們就不展開的這么詳細了,梳理核心脈絡~


start源碼分析

Bootstrap#main -----> daemon.start(); -------反射調用-------> Catalina # start -------------> getServer().start(); -------模板方法LifeCycleBase--------> startInternal();

還是模板模式

StandardServer Start

這里主要是繼續啟動Service

StandardService Start

還是會走到生命周期里 ,統一收到LifeCycle接口定義的生命周期管理 抽象類LifeCycleBase ,子類重寫startInternal()


一樣的套路

精簡后的核心代碼如下:

@Overrideprotected void startInternal() throws LifecycleException {// Start our defined Container firstif (engine != null) {synchronized (engine) {engine.start();}}// Start our defined Connectors secondsynchronized (connectorsLock) {for (Connector connector: connectors) {connector.start();}}}

分兩大塊

  • engine.start()
  • connector.start()

接下來逐一分析


StandardEngine Start

大致流程一覽
StandardEngine # startInternal ---------> 調用父類ContainerBase#startInternal ---------> startStopExecutor 將子容器Host提交到具體的StartChild線程類并行執行 —> … 使用事件驅動 初始化 Servlet


仔細看看吧

繼續 LifeCycleBase # startInternal();

調用 StandardEngine

@Overrideprotected synchronized void startInternal() throws LifecycleException {// Standard container startupsuper.startInternal();}


父類 ContainerBase # startInternal 的方法

看下調用棧 也能看出

跟進去 關鍵代碼

結合Server.xml配置文件 Engine節點信息

// 查找子容器,啟動子容器 // Start our child containers, if anyContainer children[] = findChildren();List<Future<Void>> results = new ArrayList<>();for (Container child : children) {results.add(startStopExecutor.submit(new StartChild(child)));}


children事實上就是Host的集合, 然后 startStopExecutor 提交啟動任務 ,這個startStopExecutor就是在load節點初始化好的,這里來使用。

那就看 StartChild 線程唄

繼續走

跟進去 還是 LifyCycleBean --> StandardHost # startInternal -----> super.startInternal(); ----> setState(LifecycleState.STARTING);

設置生命周期 觸發實例化Context —> LifyCycleBean # setStateInternal -----> fireLifecycleEvent(lifecycleEvent, data);


觸發Host的生命周期事件后,將后續工作交給生命周期監聽器HostConfig來進行,Hostconfig#lifecycleEvent方法,捕獲start事件,執行start方法

緊接著就是下面的流程了

-------> Hostconfig#deployApps--------------> Hostconfig#deployDirectories ,以線程方式并行處理多個項目 ---------> DeployDirectory 線程類 ------>Hostconfig#deployDirectory-----------------------> 通過xml解析對象進行分析,設置一些context應用的必要屬性 ,在addChild方法中完善context的過程 -------> ContainerBase#addChild方法--------------> ContainerBase#addChildInternal---------> StandardContext#startInternal方法 ------------> 給每個應用設置類加載器 ,把具體每個應用的處理交給了ContextConfig . loadOnStartup方法根據web.xml中配置servlet的load-on-startup來進行創建實例化對應servlet。執行之后,instance就有具體對象了。 ------> StandardContext#loadOnStartup方法 ------> StandardWrapper#load方法 ---------------------> StandardWrapper#loadServlet方法


Connector Start

主要流程

Connector# startInternal ------> AbstractProtocol# start -----------> AbstractEndpoint # start ----------> NioEndpoint# startInternal ----------> AbstractEndpoint#startAcceptorThreads ------> NioEndpoint# createAcceptor -------> Acceptor線程#run方法 Socket.Accept


小結

總結

以上是生活随笔為你收集整理的Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。