Tomcat实现热部署、热加载原理解析(下)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Tomcat实现热部署、热加载原理解析

Context#backgroundProcess

StandardContext实现类中:

@Override
public void backgroundProcess() {
    if (!getState().isAvailable())
        return;
    // WebappLoader周期性检查
    // WEB-INF/classes、WEB-INF/lib 目录下的类文件是否有更新
    Loader loader = getLoader();
    if (loader != null) {
        loader.backgroundProcess();        
    }
    // Session管理器周期性检查是否有Session过期
    Manager manager = getManager();
    if (manager != null) {
        manager.backgroundProcess();
    }
    // 周期性检查静态资源是否有更新
    WebResourceRoot resources = getResources();
    if (resources != null) {
        resources.backgroundProcess();
    }
    super.backgroundProcess();
}

WebappLoader是如何实现热加载的呢?

关键是调用Context#reload方法:


停止和销毁Context容器及其所有子容器(Wrapper),即Wrapper里的Servlet实例也被销毁

停止和销毁Context容器关联的Listener和Filter

停止和销毁Context下的Pipeline和各种Valve

停止和销毁Context的类加载器,以及类加载器加载的类文件资源


启动Context容器,在这个过程中会重新创建前面四步被销毁的资源。

在这个过程中,类加载器发挥着关键作用。一个Context容器对应一个类加载器,类加载器在销毁的过程中会把它加载的所有类也全部销毁。Context容器在启动过程中,会创建一个新的类加载器来加载新的类文件。


在Context的reload方法里,并没有调用Session管理器的destroy方法,也就是说这个Context关联的Session是没有销毁的。


Tomcat热加载默认是关闭的,需在conf目录下的context.xml文件中设置reloadable参数开启:

<Context reloadable="true"/>

Tomcat热部署

跟热加载的本质区别是:

热部署会重新部署Web应用,原Context对象会被整个被销毁,因此该Context所关联一切资源都会被销毁,包括Session。


Tomcat热部署由哪个容器实现呢?

不是由Context,因为热部署过程中Context容器被销毁了,所以就是Host,Context的父容器。


Host容器并未在backgroundProcess中实现周期性检测,而是通过监听器HostConfig实现。

HostConfig就是前面提到的“周期事件”的监听器,“周期事件”达到时,HostConfig会做什么呢?


public void lifecycleEvent(LifecycleEvent event) {
    // 执行check
    if (event.getType().equals(Lifecycle.PERIODIC_EVENT)) {
        check();
    } 
}
protected void check() {
    if (host.getAutoDeploy()) {
        // 检查这个Host下所有已经部署的Web应用
        DeployedApplication[] apps =
            deployed.values().toArray(new DeployedApplication[0]);
        for (int i = 0; i < apps.length; i++) {
            //检查Web应用目录是否有变化
            checkResources(apps[i], false);
        }
        // 执行部署
        deployApps();
    }
}

HostConfig会检查webapps目录下的所有Web应用:

  • 如果原来Web应用目录被删掉了,就把相应Context容器整个销毁掉
  • 是否有新的Web应用目录放进来了,或者有新的WAR包放进来了,就部署相应的Web应用


因此HostConfig做的事情都是比较“宏观”的,它不会去检查具体类文件或者资源文件是否有变化,而是检查Web应用目录级别变化。

目录
相关文章
|
22天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
7天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
3天前
|
人工智能 前端开发 Java
【Tomcat源码分析】启动过程深度解析 (二)
本文深入探讨了Tomcat启动Web应用的过程,重点解析了其加载ServletContextListener及Servlet的机制。文章从Bootstrap反射调用Catalina的start方法开始,逐步介绍了StandardServer、StandardService、StandardEngine、StandardHost、StandardContext和StandardWrapper的启动流程。每个组件通过Lifecycle接口协调启动,子容器逐层启动,直至整个服务器完全启动。此外,还详细分析了Pipeline及其Valve组件的作用,展示了Tomcat内部组件间的协作机制。
【Tomcat源码分析】启动过程深度解析 (二)
|
23天前
|
vr&ar
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
这篇文章介绍了一种简单易懂的全景图高清下载方法,使用在线网站全景管家,支持下载包括建E、720yun、酷雷曼等多个平台的全景图原图,并简要解析了全景图的原理和制作方法。
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
|
18天前
|
域名解析 网络协议
DNS服务工作原理
文章详细介绍了DNS服务的工作原理,包括FQDN的概念、名称解析过程、DNS域名分级策略、根服务器的作用、DNS解析流程中的递归查询和迭代查询,以及为何有时基于IP能访问而基于域名不能访问的原因。
37 2
|
26天前
|
JavaScript 前端开发 安全
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
36 2
|
26天前
|
缓存 前端开发 JavaScript
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
22 1
|
28天前
|
设计模式 JavaScript 前端开发
Vue响应式原理全解析
Vue的响应式系统是其核心特性之一,它使得Vue能够以高效的方式响应数据的变化。通过对对象属性的getter和setter进行劫持,Vue实现了对数据变化的侦测和依赖收集,当数据变化时能够自动派发更新。Vue3中,响应式系统得到了进一步的加强和优化,使用Proxy替代了 `Object.defineProperty`,带来了更好的性能和更强大的拦截能力。理解Vue的响应式原理,对于深入理解Vue的工作机制和进行高效的Vue开发都具有重要意义。
34 1
|
1月前
|
缓存 监控 网络协议
DNS缓存中毒原理
【8月更文挑战第17天】
64 1
|
14天前
|
负载均衡 网络协议 安全
DNS解析中的Anycast技术:原理与优势
【9月更文挑战第7天】在互联网体系中,域名系统(DNS)将域名转换为IP地址,但网络规模的扩张使DNS解析面临高效、稳定与安全挑战。Anycast技术应运而生,通过将同一IP地址分配给多个地理分布的服务器,并依据网络状况自动选择最近且负载低的服务器响应查询请求,提升了DNS解析速度与效率,实现负载均衡,缓解DDoS攻击,增强系统高可用性。此技术利用动态路由协议如BGP实现,未来在网络发展中将扮演重要角色。
42 0

推荐镜像

更多