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ù):
- 執(zhí)行容器中Cluster組件的周期性任務(wù)(集群管理有關(guān)
- 執(zhí)行容器中Realm組件的周期性任務(wù)(安全管理有關(guān)
- 執(zhí)行容器中valve組件的周期性任務(wù)
- 觸發(fā)容器中“周期性事件”,Host容器的監(jiān)聽器HostConfig就靠它來調(diào)用
類似容器的生命周期事件:初始化、啟動和停止。
Tomcat 熱加載
基于ContainerBase的周期性任務(wù)處理框架,容器只要實現(xiàn)自己的周期性任務(wù)就可以被調(diào)用起來。比如Context容器中的backgroundProcess:
- webapploader周期性的檢查WEB-INF/classes和WEB-INF/lib目錄下的類文件
- session管理器周期性檢查是否有過期的session
- 周期性的檢查靜態(tài)資源是否有變化
- 調(diào)用父類的ContainerBase的backgroundProcess
那webapploader是怎么實現(xiàn)熱加載的?
主要調(diào)用了Context容器的reload方法:
- 停止和銷毀Context容器及其所有子容器,子容器就是servlet,也就是Context容器中的Servlet實例也被銷毀了。
- 停止和銷毀Context容器關(guān)聯(lián)的Listner和filter
- 停止和銷毀Context下的Pipeline和各種Valve
- 停止和銷毀Context的類加載器,以及類加載器加載的類文件資源。
- 啟動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)用:
- 如果原來的web應(yīng)用目錄被刪掉了,就把相應(yīng)Context容器整個銷毀掉
- 是否有新的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ù)的功能。