tomcat源码阅读之部署器
我们知道web应用是用Context实例表示的,而Context是部署到Host实例中的,因此tomcat的部署器是关联的Host实例。Context实例可以用WAR文件部署,也可以把整个web应用的文件夹复制到webapp目录下,而部署器在部署时会扫描webapp目录下的web应用程序,并且还会启动一个监控线程定期扫描webapp目录下的web应用是否发生了更新,如果有更新则重新部署更新的web应用;
一、UML图:

1、部署器的接口是Deployee,其中install方法可以安装一个web应用,findDeployedApp可以查找已经安装到Host中的web应用程序,start方法启动指定的Context,stop方法关闭指定的Context;
2、StandardHost类和StandardHostDeployer类均实现了Deployer接口,StandardHost类的install方法都是委托给StandardHostDeployer类实现的,而StandardHostDeployer的install方法又会调用StandardHost类的addChild方法将Context的name和对象实例保存到Hash表中,代码如下:

3、HostConfig类作为Host实例的监听器,在Host实例启动时会发出一个START_EVENT事件,HostConfig实例在收到START_EVENT事件时会调用start方法,在start方法中会去扫描webapp目录下的应用程序并安装到Host中,然后启动这些Context应用,同时会启动一个线程在后台定时扫描webapp目录下的Context应用是否有发生更新,扫描更新时调用的checkWebXmlLastModified方法检查web应用是否有更新,如果有更新则重新安装并启动Context;

deployApps方法会扫描webapp目录下的web应用并安装启动,threadStart方法会启动一个线程,在线程的run方法中定期扫描webapp目录下web应用是否有更新并重新发布Context应用(默认是间隔15秒扫描一次):

4、deployApps会扫描webapp目录下的xml文件、WAR文件和web应用目录:

安装web应用目录时,会创建StandardContext实例,并设置其Path和DocBase属性,安装WAR文件时也是先将WAR文件解压到webapp目录下,然后用与安装目录同样的方式安装Context应用;

而安装xml文件的方法则web应用可以不在webapp目录下,只需要在xml文件中配置Context元素,并且指定Context元素的DocBase属性,这样在扫描到Context元素时就能创建Context实例并设置其DocBase属性(DocBase属性可以指向其他路径下的web应用),如下:


5、HostConfig类的实例并没有直接的代码去创建,而是通过xml文件配置,Digester对象扫描xml文件时生成HostConfig对象并添加到Host实例的监听器中:

二、部署web应用流程:

1、当StandardHost的start方法被调用时会发出START_EVENT事件,HostConfig作为StandardHost的监听事件也会收到这个事件,然后会调用HostConfig.start方法;
2、HostConfig.start方法中会调用deployApps发布web应用,deployApps会扫描webapp目录下的xml描述文件、WAR文件和web应用目录并分别发布;
3、在发布指定的应用时调用Host.install方法,Host.install又委托给StandardHostDeployer类的实例的install方法;
4、StandardHostDeployer.install方法发布web应用时,如果是xml描述应用,则使用Digester扫描xml,生成Context对象并设置属性;如果是WAR文件或者目录形式的web应用时,会根据web应用路径生成StandardContext实例;然后调用Host.addChild方法将生成的Context实例和Context名称属性添加到一个Hash表中,这样在Host实例中根据名称就能查找到对应的Context实例;
tomcat源码阅读之部署器的更多相关文章
- tomcat源码阅读之载入器(Loader)
一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...
- SpringMVC源码阅读:拦截器
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- Tomcat源码阅读(二)初始化
近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...
- tomcat源码阅读
1 工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2 下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...
- tomcat源码阅读之过滤器
一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...
- tomcat源码阅读之SingleThreadModel
一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...
- tomcat源码阅读之session管理器(Manager)
一.UML图分析: (一) Session: Session保存了一个客户端访问服务器时,服务器专门为这个客户端建立一个session用来保存相关的会话信息,session有一个有效时间,这个时间默认 ...
- tomcat源码阅读之BackupManager
一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...
- tomcat源码阅读之集群
一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...
随机推荐
- svn拒绝连接
svn 服务开启: svnserve -d -r /home/svn
- React脚手架create-react-app+elementUI使用
一.介绍 1.create-react-app是FaceBook官方发布了一个无需配置的.用于快速构建开发环境的脚手架工具. 2.优点 a.无需配置:官方的配置堪称完美,几乎不用你再配置任何东西,就可 ...
- idea开发工具安装说明
开发工具安装说明 安装JDK1.8 第一步,双击"jdk-8u45-windows-i586.exe"安装文件,进行安装,具体安装过程如下图所示: 第二步,右键我的电脑-属性- ...
- 微信小程序wx.chooseImage和wx.previewImage的综合使用(图片上传可以限制个数)
本例从微信小程序的组件扒下来的. WXML: <view class="weui-cell"> <view class="weui-cell__bd&q ...
- learning uboot enable protect console
reference :https://github.com/lentinj/u-boot/blob/master/doc/README.autoboot how to enable protect s ...
- learning docker steps(7) ----- docker registry 搭建
参考: https://docs.docker.com/engine/reference/builder/ https://hub.docker.com/_/registry/ https://www ...
- learning docker steps(6) ----- docker 镜像加速
http://www.docker-cn.com/registry-mirror 通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像.该镜像托管于中国大陆,本地用户现 ...
- MinGW的gdb调试
MinGW(Minimalist GNU for Windows)提供了一套简单方便的Windows下的基于GCC程序开发环境.MinGW收集了一系列免费的Windows是用的头文件和库文件: ...
- Mysql 分区表-分区操作
一.查看MySQL是否支持分区 1.MySQL5.6以及之前版本 show variables like '%partition%'; 2.MySQL5.7 show plugins; 二.分区表的分 ...
- Memcached 扩展常用方法
保存数据 向memcached保存数据的方法有 add replace set 它们的使用方法都相同: $add = $memcached->add( '键', '值', '期限' ); $re ...