深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

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

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

Tomcat 的后台线程

要说开启后台线程做周期性的任务,有经验的同学马上会想到线程池中的 ScheduledThreadPoolExecutor,它除了具有线程池的功能,还能够执行周期性的任务。Tomcat 就是通过它来开启后台线程的:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

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

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

    2019-07-02
    8
  • 曹宇
    为什么 Host 容器不通过重写 backgroundProcess 方法来实现热部署呢?
    因为这种方式的传递方向是从父容器到子容器,而HOST容器部署依赖Context容器部署完毕,才能部署应用,也就是先要子容器Context完成热部署后才能Host容器进行部署。所以针对这种情况,提供了周期性事件机制。
    2019-07-03
    1
    4
  • -W.LI-
    老师好!是因为基于事件,可以解耦么?

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

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

    作者回复: 这里有个容易混淆的概念,类 和 类实例。

    new出来的是类实例,类实例创建后有个引用指向它,将这个引用=null,之后jvm gc会回收这个类实例。

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

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

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

    作者回复: 对的

    2019-07-02
    2
  • nate
    scheduleWithFixedDelayd的第二个和第三个传参应该是:backgroundProcessorInitialDelay和backgroundProcessorDelay
    2019-07-09
    1
  • 听雨
    老师讲的web应用目录级别的变化是指人为的删除或者添加web应用吗这种情况吗

    作者回复: 对的

    2019-08-13
  • 疯狂咸鱼
    老师,您文中提到的Session是http中的Session么

    作者回复: 对的

    2019-08-09
  • nightmare
    Host热部署是父容器,如果也采用定时任务,那么context都重新加载了,也就没有热加载什么事情了
    2019-07-03
  • nightmare
    热加载的定位是某些文件更新,热部署是通过用户手动加了一个项目,热部署没有必要定时执行,只需要监听用户的热部署事件就行
    2019-07-02
  • 代码搬运工
    backgroundProcess 方法主要用在加载粒度比较小,加载具体的资源、文件。而热部署是直接销毁Context,然后重新部署,所以不适合。
    2019-07-02
  • 热加载这种设计感觉就是一个树结构,从根开始遍历执行到所有叶,学习了。
    2019-07-02
  • Liam
    热部署也会导致系统短暂地不可用吧?我理解它只不过是通过后台线程周期性任务实现了一下自动重启功能?

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

    2019-07-02
收起评论
14
返回
顶部