23 | Host容器:Tomcat如何实现热部署和热加载?
该思维导图由 AI 生成,仅供参考
Tomcat 的后台线程
- 深入了解
- 翻译
- 解释
- 总结
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-02523 - -W.LI-老师好!是因为基于事件,可以解耦么?
作者回复: 这是其中一个原因,只要还是Host的周期性任务比较简单,只要检查部署是否有更新;而Context组件那样,周期性任务比较复杂,不得不重写父类的方法。
2019-07-0211 - 锟铻请教一个疑问,文中讲的在热部署过程中:停止和销毁 Context 容器及其所有子容器,这个跟热加载一样都销毁了context容器,只是在销毁session有区别,对不,
作者回复: 是的,还有个本质区别是Context对象本身有没有被gc调
2019-07-237 - QQ怪老师,问个问题,我们平常在开发中,在已经运行的应用上改了代码之后然后编译,是不是就是主动热加载?
作者回复: 对的
2019-07-027 - Liam热部署也会导致系统短暂地不可用吧?我理解它只不过是通过后台线程周期性任务实现了一下自动重启功能?
作者回复: 对的,部署过程中不能访问
2019-07-027 - 飞翔老师 求问 我们生成一个类 可以用反射 也可以用 new, 那么你说在热部署的时候很多类都被销毁了,那销毁调用的是哪个函数呀
作者回复: 这里有个容易混淆的概念,类 和 类实例。 new出来的是类实例,类实例创建后有个引用指向它,将这个引用=null,之后jvm gc会回收这个类实例。
2019-07-234 - 学无涯老师讲的web应用目录级别的变化是指人为的删除或者添加web应用吗这种情况吗
作者回复: 对的
2019-08-133 - 尔冬橙老师,您文中提到的Session是http中的Session么
作者回复: 对的
2019-08-092 - nightmare热加载的定位是某些文件更新,热部署是通过用户手动加了一个项目,热部署没有必要定时执行,只需要监听用户的热部署事件就行2019-07-024
- Edward Lee课后习题 因为 Host 位于容器的最顶层,已经没有可以调用 Host backgroundProcess 方法的更顶层容器了,再上一层就是重启2020-11-202