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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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应用目录级别变化。

目录
相关文章
|
20天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
38 3
|
1月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
存储 C语言 C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(一)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
7天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
22 1
|
13天前
|
数据采集 存储 编解码
一份简明的 Base64 原理解析
Base64 编码器的原理,其实很简单,花一点点时间学会它,你就又消除了一个知识盲点。
42 3
|
1月前
|
前端开发 Java 应用服务中间件
21张图解析Tomcat运行原理与架构全貌
【10月更文挑战第2天】本文通过21张图详细解析了Tomcat的运行原理与架构。Tomcat作为Java Web开发中最流行的Web服务器之一,其架构设计精妙。文章首先介绍了Tomcat的基本组件:Connector(连接器)负责网络通信,Container(容器)处理业务逻辑。连接器内部包括EndPoint、Processor和Adapter等组件,分别处理通信、协议解析和请求封装。容器采用多级结构(Engine、Host、Context、Wrapper),并通过Mapper组件进行请求路由。文章还探讨了Tomcat的生命周期管理、启动与停止机制,并通过源码分析展示了请求处理流程。
|
28天前
|
开发框架 缓存 前端开发
electron-builder 解析:你了解其背后的构建原理吗?
本文首发于微信公众号“前端徐徐”,详细解析了 electron-builder 的工作原理。electron-builder 是一个专为整合前端项目与 Electron 应用的打包工具,负责管理依赖、生成配置文件及多平台构建。文章介绍了前端项目的构建流程、配置信息收集、依赖处理、asar 打包、附加资源准备、Electron 打包、代码签名、资源压缩、卸载程序生成、安装程序生成及最终安装包输出等环节。通过剖析 electron-builder 的原理,帮助开发者更好地理解和掌握跨端桌面应用的构建流程。
60 2
|
1月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
47 9
|
1月前
|
负载均衡 应用服务中间件 Apache
Tomcat负载均衡原理详解及配置Apache2.2.22+Tomcat7
Tomcat负载均衡原理详解及配置Apache2.2.22+Tomcat7
34 3

推荐镜像

更多