tomcat-1

tomcat-1

tomcat 熱部署和熱加載

熱部署和熱加載可以在運行過程中不重啟系統(tǒng)升級WEB應(yīng)用。

熱加載

實現(xiàn)方式是web容器啟動一個后臺線程,定期檢測類文件的變化,如果有變化,就重新加載類,在這個過程中不會清空session,一般用在開發(fā)環(huán)境。

熱部署

也是由后臺線程定時檢測WEB應(yīng)用的變化,但它會重新加載整個WEB應(yīng)用。這種方式會清空session,比熱加載更加干凈、徹底,一般用在生產(chǎn)環(huán)境。

tomcat 后臺線程

tomcat使用scheduledThreadPoolExecutor來開啟后臺線程。scheduledThreadPoolExecutor一般用于執(zhí)行后臺周期性任務(wù),還具備線程池功能。

bgFuture=exec.scheduleWithFixedDelay(new ContainerBackgroundProcessor(),backgroundProcessorDelay,backgroundProcessorDelay,TimeUnit.SECONDS);

其中,ContainerBackgroundProcessor()方法中的processChildren方法中,除了調(diào)用當前容器的backgroundProcess方法,還會遞歸調(diào)用子容器的backgroundProcess方法。而backgroundProcess方法是Container接口中的方法,所以當Engine容器中啟動這個后臺線程,這個后臺線程不但會執(zhí)行Engine容器中的周期性任務(wù),還會執(zhí)行所有子容器的周期性任務(wù)。

backgroundProcess

基類ContainerBase中backgroundProcess會執(zhí)行以下周期性任務(wù):

  1. 執(zhí)行容器中Cluster組件的周期性任務(wù)(集群管理有關(guān)
  2. 執(zhí)行容器中Realm組件的周期性任務(wù)(安全管理有關(guān)
  3. 執(zhí)行容器中valve組件的周期性任務(wù)
  4. 觸發(fā)容器中“周期性事件”,Host容器的監(jiān)聽器HostConfig就靠它來調(diào)用

類似容器的生命周期事件:初始化、啟動和停止。

Tomcat 熱加載

基于ContainerBase的周期性任務(wù)處理框架,容器只要實現(xiàn)自己的周期性任務(wù)就可以被調(diào)用起來。比如Context容器中的backgroundProcess:

  1. webapploader周期性的檢查WEB-INF/classes和WEB-INF/lib目錄下的類文件
  2. session管理器周期性檢查是否有過期的session
  3. 周期性的檢查靜態(tài)資源是否有變化
  4. 調(diào)用父類的ContainerBase的backgroundProcess

那webapploader是怎么實現(xiàn)熱加載的?

主要調(diào)用了Context容器的reload方法:

  1. 停止和銷毀Context容器及其所有子容器,子容器就是servlet,也就是Context容器中的Servlet實例也被銷毀了。
  2. 停止和銷毀Context容器關(guān)聯(lián)的Listner和filter
  3. 停止和銷毀Context下的Pipeline和各種Valve
  4. 停止和銷毀Context的類加載器,以及類加載器加載的類文件資源。
  5. 啟動Context容器,在這個過程中會重新創(chuàng)建前面4步被銷毀的資源。

注意,Context的reload方法里沒有調(diào)用Session的destory方法,也就是說Context關(guān)聯(lián)的Session是沒有被銷毀的。
一般來說,tomcat的熱加載默認是關(guān)閉的,通過reloadable配置打開。

Tomcat熱部署

熱部署和熱加載的關(guān)鍵區(qū)別是熱部署會重新部署Web應(yīng)用,原來的Context對象被會銷毀,因此與Context關(guān)聯(lián)的一切資源也會被銷毀,包括Session。

Context被銷毀了,那熱部署就由Context的父容器Host來實現(xiàn)了。

跟Context不一樣,Host容器不是通過backgroundProcess實現(xiàn)周期性檢測任務(wù),而是通過監(jiān)聽器HostConfig來實現(xiàn)。HostConfig也是前面說到周期性任務(wù)的其中一步。

hostConfig

hostConfig就觀察webapps目錄下的所有web應(yīng)用:

  1. 如果原來的web應(yīng)用目錄被刪掉了,就把相應(yīng)Context容器整個銷毀掉
  2. 是否有新的web應(yīng)用目錄被放進來了,或者有新的WAR包放進來了,就部署相應(yīng)的web應(yīng)用

HostConfig做的事情比較宏觀,它不會去檢查具體的類文件或者資源文件是否有變化,而是檢查web應(yīng)用目錄級別的變化。

總結(jié)

  • 熱加載的粒度比較小,主要是針對類文件的更新,通過創(chuàng)建新的類加載器來實現(xiàn)重新加載。
  • 熱部署是針對整個web應(yīng)用,tomcat會將原來Context對象銷毀,再重新創(chuàng)建新的Context對象
  • Tomcat在基類ContainerBase中統(tǒng)一實現(xiàn)了后臺線程的邏輯,在頂層容器Engine中啟動后臺線程,其他子容器不需要再額外創(chuàng)建后臺線程也可以實現(xiàn)后臺檢測周期性任務(wù)的功能。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容