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 ...
随机推荐
- service几种访问类型(集群外负载均衡访问LoadBalancer , 集群内访问ClusterIP,VPC内网负载均衡LoadBalancer ,集群外访问NodePort)
一.集群外访问(负载均衡) kind: ServiceapiVersion: v1spec: ports: - protocol: TCP port: 4341 targetPort: 8080 no ...
- 以DefaultFuture为例,看类变量初始化顺序
https://stackoverflow.com/questions/8517121/java-what-is-the-difference-between-init-and-clinit# < ...
- 无名管道跟dup,dup的使用
参考资料: http://www.tldp.org/LDP/lpg/node11.html http://blog.csdn.net/yeyuangen/article/details/6852682 ...
- 51nod1210
题解: 二维树状数组,再矩阵推一下 代码: #include<bits/stdc++.h> using namespace std; typedef long long LL; ; int ...
- Python Oracle数据库监控
有的时候无法使用Oracle自带的OEM监控,那么就需要确定一个监控方案. 此方案,使用Python+Prometheus+Grafana+Oracle 1.监控配置表 -- Create table ...
- UAC 注册表 WIN64 OS 运行时主题
首先EXE程序是32位,DelphiIDE对Project默认是启用主题的,默认情况在WIN64 OS下运行时,无管理员权限. WIN64 OS,默认情况下UAC是启用的. 上述默认情况下,EXE 是 ...
- pywin32 的安装
这个东西不是在包管理器安装一下就可以的. https://github.com/mhammond/pywin32/releases 请到git下载exe安装文件.
- Installing MIB in Ubuntu and Solving the Error “SNMP Cannot Find Module …”
Has noticed an error after executing the command snmpwalk with the indication of MIB instead of OID: ...
- php property_exists
property_exists("Device",$prop))判断Device 类中是否存在 $prop 这个属性该函数用来判断一个类中是否存在某个属性. 这里分析了php面向对 ...
- 源代码管理:SVN源代码管理器在ASP.NET VS中的使用注意事项
一共有三个软件 1.ASP.NET下SVN有三个是不受管理的,bin文件夹,obj文件夹,.user类型文件,位置在TortoiseSVN的Settings下面的Subversion下的[Global ...