请注意,本文编写于 548 天前,最后修改于 548 天前,其中某些信息可能已经过时。
Tomcat热部署和热加载是在Tomcat服务器中实现动态更新Web应用的两种方式。热部署是重新部署整个Web应用,而热加载是在运行时重新加载类文件,从而实现应用的升级。
热加载和热部署的区别:
- 热加载:在运行时重新加载类文件,实现应用的升级。热加载的实现方式是在Web容器中启动一个后台线程,定期检测相关文件的变化,如果有变化就重新加载类。这个过程不会清空Session,通常在开发环境中使用[1]。
- 热部署:重新部署整个Web应用,原Context对象会被销毁,因此该Context所关联的所有资源都会被销毁,包括Session。热部署在生产环境中使用[1]。
Tomcat实现热加载和热部署的原理解析:
- 热加载:
- Tomcat通过开启后台线程来实现周期性任务的处理。这个后台线程是通过ScheduledThreadPoolExecutor线程池来创建的[1]。
- 在Tomcat的基类ContainerBase中,有一个内部类ContainerBackgroundProcessor,它实现了Runnable接口,并在run方法中调用了processChildren方法[1]。
- processChildren方法会递归调用容器及其子容器的backgroundProcess方法,以完成周期性任务的处理[1]。
- 在Context容器中的backgroundProcess方法中,会调用WebappLoader的backgroundProcess方法来实现热加载。WebappLoader会周期性检查WEB-INF/classes和WEB-INF/lib目录下的类文件是否有更新,如果有更新则重新加载类文件[1]。
- 热部署:
- 热部署是通过重新部署整个Web应用来实现的。
- 在Context容器的reload方法中,会停止和销毁当前的Context容器及其所有子容器(Wrapper),包括销毁Wrapper中的Servlet实例[1]。
- 还会停止和销毁Context容器关联的Listener和Filter,以及停止和销毁Context下的Pipeline和各种Valve[1]。
- 接着,会停止和销毁Context的类加载器,以及类加载器加载的类文件资源[1]。
- 最后,重新启动Context容器,重新创建之前被销毁的资源[1]。
默认情况下,Tomcat的热加载和热部署是关闭的。如果需要开启热加载和热部署,可以在Tomcat的conf目录下的context.xml文件中设置相应的参数,如设置reloadable="true"来开启热部署[1]。
Learn more:
- Tomcat实现热部署、热加载原理解析-腾讯云开发者社区-腾讯云
- 热加载和热部署,没听过?看看 Tomcat 是怎么实现的-阿里云开发者社区
- 死磕Tomcat系列(6)--Tomcat如何做到热加载和热部署的 - 掘金
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!