前言

热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载 class,从而升级应用。

通常情况下在开发环境中我们使用的是热加载,因为热加载的实现的方式在 Web 容器中启动一个后台线程,定期检测相关文件的变化,如果有变化就重新加载类,这个过程不会清空 Session。而在生产环境我们一般应用的是热部署,热部署也是在 Web 应用后台线程定期检测,发现有变化就会重新加载整个 Web 应用,这种方式更加彻底会清空 Session。

# 热加载

热加载其实我们在开发过程中经常使用,例如我们使用 Idea 开发时,我们在设置页面可以进行设置,当修改文件时,我们可以选择不重启项目,选择重新加载此文件。而在 Tomcat 中也能设置,Tomcat 默认情况下是不开启热加载的。需要在 Tomcat 路径下的 Context.xml 中配置 reloadable 参数来开启这个功能。

我们演示一下 Tomcat 是如何热加载的。在 webapp 下我们新建了一个项目,里面的 Servlet 文件如下

目录结构如下

为了演示 Tomcat 运行时能修改 class 文件能够动态加载。我们分为以下三步

  1. 正常启动 Tomcat。输入 http://localhost:8080/mywebapp/myservlet,观察页面输出

  2. 在 Tomcat 启动的情况下修改 MyServlet 文件后覆盖原来的 class 文件

  3. 再次观察页面情况。观察页面输出是否修改

下面直接用动态图演示效果,更直观一些。

我们可以看到在 Tomcat 运行的情况下,直接替换 class 文件是能够直接生效的。那么 Tomcat 是如何做到的呢?其实我们可以自己推导一下。

  1. 所有的 class 文件都是交由类加载来管理的

  2. 如果换了 class 文件是不是只需要更换相应的类加载器重新加载就行

那么接下来我们来验证我们的结论,看一下在 Tomcat 中是如何实现热加载的。Tomcat 要监听 class 文件是否变化应该是新起了一个线程来观测。那么看到在 Context 的启动方法中,看到调用了 threadStart 的方法。

其中在后台开启周期性的任务,使用了 Java 提供的 ScheduledThreadPoolExecutor。除了能周期性执行任务以外还有线程池的功能。上面代码中调用了 scheduleWithFixedDelay 方法,第一个传入的参数就是要执行的任务。我们接下来看任务类 ContainerBackgroundProcessor 是如何实现的。

上面代码中我们可以知道具体的后台监听代码是在 backgroundProcess 方法中实现的。那么我们看 Context 容器的 backgroundProcess 方法是如何实现的。

进去 loader.backgroundProcess();中我们可以看到

我们可以发现 Tomcat 热加载的步骤

  1. 如果发现有文件发生变化,热加载开关开启

  2. 关闭 Context 容器

  3. 重启 Context 容器

在这个过程中,最重要的部分其实就是类加载器了。因为一个 Context 容器对应一个类加载器。所以在销毁 Context 容器的时候也连带着将其类加载器一并销毁了。Context 在重启的过程中也会创建新的类加载器来加载我们新建的文件。

# 热部署

如果还是不懂热部署是什么的,下面演示一遍应该就明白了。Tomcat 在启动的时候会将其目录下 webapp 中 war 包解压后然后封装为一个 Context 供外部访问。那么热部署就是在程序运行时,如果我们修改了 War 包中的东西。那么 Tomcat 就会删除之前的 War 包解压的文件夹,重新解压新的 War 包。

我们发现上面动图中在 Tomcat 运行时,我们修改了 War 包的信息,它就会将原来的删除然后重新生成一份。

我们从上面的动图中其实就看出了热部署和热加载的区别了。热部署是将文件夹删除然后重新解压包。那么热加载是由 Context 容器负责的。那么热部署又是由哪个容器负责呢?因为一个文件夹对应一个 Context。既然文件夹都删除了,那么肯定不是由 Context 容器负责了。那么应该就是 Context 的父容器 Host 来负责。

我们可以看到 Host 容器并没有实现自己的 backgroundProcess 方法。那么它是如何监听的呢?既然它没有实现方法,肯定是调用了父类的 backgroundProcess 方法。我们可以看到在父类的 backgroundProcess 中

可以看到周期事件的监听器。而 Host 的事件监听器是 HostConfig 类的 lifecycleEvent 方法

我们可以看 check 方法

热部署的步骤其实也可以简化为三步骤

  1. 检查 Host 管理下的所有 web 应用

  2. 如果原来的 Web 应用被删除,就将相应 Context 容器删除

  3. 如果有新 War 包放进来,就部署相应的 War 包

如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

咱们下期见!答案获取方式:已赞 已评 已关~

学习更多知识与技巧,关注与私信博主(03)


京东 java 研发岗二面:Tomcat 是如何做到热加载和热部署的?相关推荐

  1. java热加载_java热加载

    应用服务器一般都支持热部署(Hot Deployment),更新代码时把新编译的确类 替换旧的就行,后面的程序就执行新类中的代码.这也是由各种应用服务器的独 有的类加载器层次实现的.那如何在我们的程序 ...

  2. 死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的

    死磕Tomcat系列(6)--Tomcat如何做到热加载和热部署的 热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用. 通常情况下在开发环境中我们使用的是热加载 ...

  3. tomcat热加载、热部署-源码解析

    上文:tomcat线程模型-源码解析 热加载和热部署是什么? 请查看原来的写过的文章:热部署和热加载有什么区别? tomcat热加载和执热部署都是通过后台进程检测项目中的.class和目录是否发生变化 ...

  4. 热加载和热部署,没听过?看看 Tomcat 是怎么实现的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 不学无数的程序员 来源 | https://urlify ...

  5. 2019年京东Java研发岗社招面经(面试经历+真题总结+经验分享)!

    本篇先以日历形式回顾秋招之路,方便各位参考某厂的处理进度:然后是总结归纳春秋招Java面试题库:最后做个总结还有展望,开始新的征程~ 面试经历 京东面试真题 面试经验分享 1.面试经历 2018年的冬 ...

  6. 美团java研发岗二面:mysql功能介绍

    这些面试题你都会了吗?(精选97道Java核心面试题) 常量池有哪些,数据结构,自己设计一个常量池 String为啥设计为final,好处是啥,其中的equals方法如何实现的 jdk序列化怎么实现, ...

  7. 美团java研发岗二面:java静态方法存储在哪个区

    思维导图 前言 在很多时候,我们都可以在各种框架应用中看到ZooKeeper的身影,比如Kafka中间件,Dubbo框架,Hadoop等等.为什么到处都看到ZooKeeper? 一. 前些年,互联网行 ...

  8. 蚂蚁金服java研发岗二面:Redis内存满了该怎么办了

    原文作者来源于非科班的科班 ,作者黎杜 概述 「三大缓存问题」只是Redis的其中的一小部分的知识点,想要深入学习Redis还要学习比较多的知识点. 那么今天就带来了一个面试常问的一个问题:「假如你的 ...

  9. java编写hot_类的热加载(Hot Deployment)的简单例子

    应用服务器一般都支持热部署(Hot Deployment),更新代码时把新编译的确类 替换旧的就行,后面的程序就执行新类中的代码.这也是由各种应用服务器的独 有的类加载器层次实现的.那如何在我们的程序 ...

最新文章

  1. 元学习—Meta Learning的兴起
  2. perl 远程 mysql_perl联接mysql
  3. php ajax 框架,PHP开发框架kohana中处理ajax请求的例子
  4. Java程序访问Mysql Cluster
  5. 如何修改ECShop发货单查询显示个数
  6. 如何看待EMNLP2021 best paper? 邱锡鹏教授:以为走错会场了
  7. logback日志pattern_[SpringBoot2.X]28- Spring Boot 的日志管理
  8. AtCoder Beginner Contest 185
  9. 未来教育计算机二级考试系统出错,未来教育计算机二级模拟考试系统
  10. 虚拟摄像头之九: IMX8Q 的 camera.imx8.hal 框架详解
  11. 叶史瓦大学计算机科学,本地知名新西兰留学咨询平台排名
  12. python写入指定文件夹_python 获取指定文件夹下所有文件名称并写入列表的实例...
  13. 基于Java Web的房屋出租管理系统
  14. Day3:现金流三拷问---投资环节
  15. 从Docker镜像构建演化史来了解多阶段构建的影响
  16. Innodb简介及性能调优
  17. 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进
  18. 如何绘制甘特图?这些软件来帮你
  19. 打印机Print Spooler服务自动关闭
  20. LeetCode刷题报告2

热门文章

  1. 1334:【例2-3】围圈报数
  2. tomcat7性能优化(转)
  3. Facebook扎克伯格身价超微软CEO鲍尔默
  4. 1111112222
  5. linux 创建逻辑卷命令,Linux对逻辑卷的创建与管理基本命令
  6. 上交所 EzOES PBU
  7. RPG游戏《黑暗之光》流程介绍与代码分析之(六):背包系统的实现(下)
  8. elasticsearch 基础介绍及使用 (high-level-client)
  9. CuteOne基于Python3的OneDrive多网盘挂载程序+带会员
  10. STM32 AD采样电压计算公式