深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38890 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

23 | Host容器:Tomcat如何实现热部署和热加载?

检查webapps目录下的所有Web应用
通过监听器HostConfig
由Host容器实现
整个Context对象被销毁
重新部署Web应用
使用资源管理器检查静态资源更新
使用Session管理器检查Session过期
使用WebappLoader检查类文件更新
触发容器的"周期事件"
执行容器中的周期性任务
递归调用子孙的backgroundProcess方法
调用processChildren方法
调用各容器的backgroundProcess方法
定期执行ContainerBackgroundProcessor
使用ScheduledThreadPoolExecutor
适用于开发环境
不清空Session
重新加载类
定期检测类文件的变化
Web容器启动后台线程
Host容器为何不通过重写backgroundProcess方法实现热部署
后台线程的周期性检查
热加载和热部署的实现
Host容器的实现
实现方式
Context容器的backgroundProcess方法
backgroundProcess方法
ContainerBackgroundProcessor
Tomcat的后台线程
实现方式
课后思考
本期精华
热部署
Tomcat热加载
热加载实现
热加载
Tomcat如何实现热部署和热加载?

该思维导图由 AI 生成,仅供参考

从这一期我们开始学习 Tomcat 的容器模块,来聊一聊各容器组件实现的功能,主要有热部署热加载、类加载机制以及 Servlet 规范的实现。最后还会谈到 Spring Boot 是如何与 Web 容器进行交互的。
今天我们首先来看热部署和热加载。要在运行的过程中升级 Web 应用,如果你不想重启系统,实现的方式有两种:热加载和热部署。
那如何实现热部署和热加载呢?它们跟类加载机制有关,具体来说就是:
热加载的实现方式是 Web 容器启动一个后台线程,定期检测类文件的变化,如果有变化,就重新加载类,在这个过程中不会清空 Session ,一般用在开发环境。
热部署原理类似,也是由后台线程定时检测 Web 应用的变化,但它会重新加载整个 Web 应用。这种方式会清空 Session,比热加载更加干净、彻底,一般用在生产环境。
今天我们来学习一下 Tomcat 是如何用后台线程来实现热加载和热部署的。Tomcat 通过开启后台线程,使得各个层次的容器组件都有机会完成一些周期性任务。我们在实际工作中,往往也需要执行一些周期性的任务,比如监控程序周期性拉取系统的健康状态,就可以借鉴这种设计。

Tomcat 的后台线程

要说开启后台线程做周期性的任务,有经验的同学马上会想到线程池中的 ScheduledThreadPoolExecutor,它除了具有线程池的功能,还能够执行周期性的任务。Tomcat 就是通过它来开启后台线程的:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Tomcat实现热部署和热加载的技术原理是通过后台线程定期检测类文件的变化,实现热加载和热部署。热加载是重新加载类文件,不清空Session,适用于开发环境;而热部署则重新加载整个Web应用,清空Session,适用于生产环境。Tomcat通过ScheduledThreadPoolExecutor开启后台线程,执行周期性任务。容器组件通过实现backgroundProcess方法来完成周期性任务,实现了优雅的设计。具体容器子类只需实现自己的周期性任务。热加载是在Context容器中实现的,通过WebappLoader检查类文件更新,调用Context的reload方法实现。reload方法包括停止和销毁容器及其子容器、类加载器等,然后重新启动容器。需要注意的是,Tomcat的热加载默认关闭,需要在context.xml文件中设置reloadable参数为true来开启。文章内容详细介绍了Tomcat实现热部署和热加载的技术原理和实现细节,对于想要深入了解Tomcat容器模块的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(29)

  • 最新
  • 精选
  • 微思
    文章读完有两点疑惑: 1、文章提到热部署和热加载的本质是热部署的Context对象整个会被销毁掉,会重新创建一个Context对象;而前文讲热加载时提到WebLoader会调用Context的reload方法,也会销毁Context对象,是否前后矛盾了? 2、整个设计自顶向下,父容器调用子容器中的backgroundProcess方法,但是到了Context容器的此方法中最后一行supper.backgroundProcess又反过来调用了父类该方法,有些不解? 还请老师指教……

    作者回复: 1,reload只是调用了context组件的方法,没有将这个对象实例销毁掉。 2,父子容器 不是 父子类 的关系。这里的backgroundProccess是ContainerBase实现的各容器的公共逻辑,不是只有父容器才有的行为。

    2019-07-02
    5
    23
  • -W.LI-
    老师好!是因为基于事件,可以解耦么?

    作者回复: 这是其中一个原因,只要还是Host的周期性任务比较简单,只要检查部署是否有更新;而Context组件那样,周期性任务比较复杂,不得不重写父类的方法。

    2019-07-02
    11
  • 锟铻
    请教一个疑问,文中讲的在热部署过程中:停止和销毁 Context 容器及其所有子容器,这个跟热加载一样都销毁了context容器,只是在销毁session有区别,对不,

    作者回复: 是的,还有个本质区别是Context对象本身有没有被gc调

    2019-07-23
    7
  • QQ怪
    老师,问个问题,我们平常在开发中,在已经运行的应用上改了代码之后然后编译,是不是就是主动热加载?

    作者回复: 对的

    2019-07-02
    7
  • Liam
    热部署也会导致系统短暂地不可用吧?我理解它只不过是通过后台线程周期性任务实现了一下自动重启功能?

    作者回复: 对的,部署过程中不能访问

    2019-07-02
    7
  • 飞翔
    老师 求问 我们生成一个类 可以用反射 也可以用 new, 那么你说在热部署的时候很多类都被销毁了,那销毁调用的是哪个函数呀

    作者回复: 这里有个容易混淆的概念,类 和 类实例。 new出来的是类实例,类实例创建后有个引用指向它,将这个引用=null,之后jvm gc会回收这个类实例。

    2019-07-23
    4
  • 学无涯
    老师讲的web应用目录级别的变化是指人为的删除或者添加web应用吗这种情况吗

    作者回复: 对的

    2019-08-13
    3
  • 尔冬橙
    老师,您文中提到的Session是http中的Session么

    作者回复: 对的

    2019-08-09
    2
  • nightmare
    热加载的定位是某些文件更新,热部署是通过用户手动加了一个项目,热部署没有必要定时执行,只需要监听用户的热部署事件就行
    2019-07-02
    4
  • Edward Lee
    课后习题 因为 Host 位于容器的最顶层,已经没有可以调用 Host backgroundProcess 方法的更顶层容器了,再上一层就是重启
    2020-11-20
    2
收起评论
显示
设置
留言
29
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部