我们知道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源码阅读之部署器的更多相关文章

  1. tomcat源码阅读之载入器(Loader)

    一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...

  2. SpringMVC源码阅读:拦截器

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  3. Tomcat源码阅读(二)初始化

    近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...

  4. tomcat源码阅读

    1      工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2      下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...

  5. tomcat源码阅读之过滤器

    一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...

  6. tomcat源码阅读之SingleThreadModel

    一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...

  7. tomcat源码阅读之session管理器(Manager)

    一.UML图分析: (一) Session: Session保存了一个客户端访问服务器时,服务器专门为这个客户端建立一个session用来保存相关的会话信息,session有一个有效时间,这个时间默认 ...

  8. tomcat源码阅读之BackupManager

    一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...

  9. tomcat源码阅读之集群

    一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...

随机推荐

  1. 连接ACCESS

    access2000-2003数据库连接字符串: ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=数据库名.mdb"; ...

  2. C++ string类与scanf和printf

    string要用cin和cout输入和输出. 如果一定要用scanf和printf的话,格式为: s.resize(20);scanf("%s", &s[0]); prin ...

  3. iOS UI-微博案例(通过代码自定义Cell)

    一.Model BWWeiBo数据模型 #import <Foundation/Foundation.h> @interface BWWeiBo : NSObject @property ...

  4. SSH执行远程命令和传送数据

    $ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub ...

  5. MySQL解析过程、执行过程

    转载:https://student-lp.iteye.com/blog/2152601 https://www.cnblogs.com/cdf-opensource-007/p/6502556.ht ...

  6. 使用axios发送post请求,将JSON数据改为为form类型

    我的github(PS:希望star):https://github.com/thWinterSun/v-admin 通常前端通过POST请求向服务器端提交数据格式有4中,分别是"appli ...

  7. kill prefix hemi hexa hepta holo input 1

    1● hemi 0.5 2● hexa 6 3● hepta 7 4● holo 100%

  8. 如何用SPY++工具查看窗体的句柄

    我安装的是vs2012,先找到SPY++工具打开 打开方式: 方式1:通过路径(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microso ...

  9. POJ 1753 bfs+位运算

    T_T ++运算符和+1不一样.(i+1)%4 忘带小括号了.bfs函数是bool 型,忘记返回false时的情况了.噢....debug快哭了...... DESCRIPTION:求最少的步骤.使得 ...

  10. VS2010创建动态链接库(DLL)的方法

    1.第一步创建WIN32项目,选择DLL 2.第二步,创建你自己的DLL CPP文件和头文件,下面以两个简单的加减法函数为例子导出 然后编译生成即可.DLL文件在Debug或Release目录中 .d ...