Tomcat作为应用服务器,我们可以理解Tomcat本身就是一个容器,用于装载应用,而作为容器本身是由若干组件以及事件构成,容器管理即为管理容器的有机组成部分。

一、Tomcat整体结构:
  • Server:即一个Tomcat服务器
  • Service:即一个Server对外提供的服务单元,一个Server下面可以有多个Service组件,一般只有一个
  • Connector:连接器,用于服务组件对外的访问器,一个服务组件可以有多个Connector子组件,不同Connector对应不同协议访问
  • Engine:引擎,是服务组件提供服务的核心组件,一个Service下有且仅有一个Engiine
  • Host:虚拟主机,用于定位服务访问的范围域,一个引擎下可以有多个虚拟主机,即除localhost外还可以是其他,另外虚拟主机还可以存在别名
  • Context:上下文,一个Host下可有存在多个独立的上下文,而一个上下文对应着我们发布的一个完整的应用
  • Realm:用于定义容器内应用程序访问认证,位于Engine下,可以有多种实现,一般我们选择UserDatabaseRealm,该Realm读取conf/tomcat-users.xml中数据进行认证
  • Value:扩展组件,用于表明上级组件具有的扩展属性,一个组件可以有多个Value组件,比如org.apache.catalina.valves.AccessLogValve访问日志组件
  • GlobalNamingResource:全局命名资源,也是全局配置问题,供所有组件按需读取与使用
    tomcat容器核心类图如下:

   容器组件主要实现了容器接口(Container),继承抽象类ContainerBase。
容器采用组合模式,容器可以有若干子容器组成,
另外所有容器都存在管道,权限,负载等其他组件部分构成。
二、Tomcat启动过程详解:
1)守护进程加载与执行
   
  • *.sh : Shell脚本进行Tomcat启动的一系列环境初始化操作以及参数初始化
  • 启动:tomcat启动程序Bootstrap,在启动时会带上*.sh执行后的参数,如下:
    /usr/bin/java
    -Djava.util.logging.config.file=/usr/local/tomcat-bs-xfb-wx-8081/conf/logging.properties
    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
    -Xms512m
    -Xmx1024m
    -Djava.endorsed.dirs=/usr/local/tomcat-bs-xfb-wx-8081/endorsed
    -classpath /usr/local/tomcat-bs-xfb-wx-8081/bin/bootstrap.jar:/usr/local/tomcat-bs-xfb-wx-8081/bin/tomcat-juli.jar
    -Dcatalina.base=/usr/local/tomcat-bs-xfb-wx-8081
    -Dcatalina.home=/usr/local/tomcat-bs-xfb-wx-8081
    -Djava.io.tmpdir=/usr/local/tomcat-bs-xfb-wx-8081/temp
    -Dcom.sun.management.jmxremote=
    -Dcom.sun.management.jmxremote.port=1099
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    -Djava.rmi.server.hostname=127.0.0.1
    org.apache.catalina.startup.Bootstrap start

  • 类加载:然后Bootstrap进行通过配置的类加载器进行lib包下jar的类加载
  • 创建守护进程:创建Catalina守护进程,同时初始化类加载器,以及digester对象
  • 容器组件装载:通过Digester读取conf/server.xml配置文件,加载各容器组件从配置文件至java对象堆中
  • 容器组件初始化:调用Server组件init方法进行初始化,Server在初始化时通过责任链模式依次调用子组件进行init方法初始化
  • 容器组件启动:调用Server组件start方法进行启动,Server在启动时通过责任链模式依次调用子组件进行start方法启动
  • 容器组件停止:调用Server组件stop方法进行停止,Server在停止时通过责任链模式依次调用子组件进行stop方法停止

  2)容器组件装载
容器在装载过程中,主要为对应的容器组件生成,以及通用处理监听器

  • 整体是通过Digester读取conf/server.xml配置文件,加载各容器组件从配置文件至java对象堆中
  • Service在装载过程默认新建一个MapperListener监听对象
  • Host在装载过程默认新建一个HostConfig监听对象
  • Context在装载过程新建一个ContextConfig监听对象

  3)容器组件初始化

  • 由于容器基本上都继承与抽象类LifecycleMBeanBase,因此在装载过程中都需要将这些对象视为Mbean注入JVM中
  • Service初始化时,调用MapperListener的初始化方法
  • Engine容器初始化时,会初始化startStopExecutor线程池,用户进程的监控的处理
4)容器组件启动
  • Service启动时,调用MapperListener的启动方法
  • MapperListener启动时,将Engine及所有子容器注册该监听,同时将所有的host,context注入到该监听内容中,另外看Context下是否配置有Wapper描述信息,如果有构建WrapperMappingInfo,供后续生成Wrapper时使用
  • Engine启动时,启动Cluster,Realm,通过startStopExecutor线程池启动Host子组件,执行监听
  • Host启动时,启动Cluster,Realm,通过startStopExecutor线程池启动Context子组件,执行监听,其中会调用HostConfig进行应用程序读取,具体加载会在下一章节进行讲解。
  • 在通过HostConfig进行应用程序加载后,调用Context子容器进行应用加载,具体加载会在下一章节进行讲解。

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/hframe/p/5318278.html

【Tomcat源码学习】-2.容器管理相关推荐

  1. Tomcat源码学习(一)

    Tomcat源码学习(一) 已有 9159 次阅读 2008-3-13 03:10 |个人分类:Tomcat|系统分类:开发 http://blog.ccidnet.com/home.php?mod= ...

  2. Tomcat源码分析(九)--Session管理

    本系列转载自 http://blog.csdn.net/haitao111313/article/category/1179996 在明白Tomcat的Session机制之前,先要了解Session, ...

  3. tomcat源码学习

    2019独角兽企业重金招聘Python工程师标准>>> 1.下载源码 在eclicpse 用svn导入源码   http://svn.apache.org/repos/asf/tom ...

  4. Box2d源码学习二内存管理之SOA的实现

    本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.csdn.net/cg0206/article/details/8258166 SOA,全称small object al ...

  5. (精)tomcat 源码学习

    Tomcat6是最新版本的web容器,其支持最新版本的servlet2.5和jsp2.1.而且Tomcat6架构也是经过重新设计优化过的,所以我们有必要分析一下它的架构过程.显然,这是一个通过阅读To ...

  6. Tomcat源码学习(9)-How Tomcat works(转)

    第2章:一个简单的Servlet容器 概要 本章通过两个程序来说明你如何开发自己的servlet容器.第一个程序被设计得足够简单使得你能理解一个servlet容器是如何工作的.然后它演变为第二个稍微复 ...

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

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

  8. Tomcat源码学习(4)-How Tomcat works(转)

    ServerSocket类 Socket类代表一个客户端套接字,即任何时候你想连接到一个远程服务器应用的时候你构造的套接字,现在,假如你想实施一个服务器应用,例如一个HTTP服务器或者FTP服务器,你 ...

  9. Tomcat源码学习(7)-How Tomcat works(转)

    Response类 ex01.pyrmont.Response类代表一个HTTP响应,在Listing 1.6里边给出.          Listing 1.6: Response类 package ...

最新文章

  1. 执行appium程序时遇到如下报错,ImportError: cannot import name 'InvalidArgumentException',...
  2. Emscripten-mac安装与升级
  3. 【SAS BASE】SCAN函数
  4. 分布式查询处理和优化相关知识介绍
  5. 入手5G手机别太急!国内部分5G手机可能有网没信号
  6. PL/SQL 调用JAVA使用UDP发送数据
  7. Linux里安装ghostscript
  8. [原创]Javascript 利用mousetrap.js进行键盘事件操作
  9. 5G笔记| 概述:5G三大应用场景、5G关键技术概览
  10. 计算机上怎么计算x的n次方,计算x的n次方(用函数)
  11. Linux WIFI模块驱动移植
  12. jquery ui 拖拽
  13. IDEA精选插件使用,建议收藏
  14. python安装报错,Windows 7 Service Pack 1 and all applicable updates
  15. SpringMVC从基础到源码
  16. 系分 - 计算机组成与体系结构
  17. 如何在cmd中运行PHP
  18. 用Bootstrap框架制作下拉列表
  19. 对于 C 源文件,IntelliSenseMode 已根据编译器参数和查询 compilerPath 从“windo
  20. 前端ES6的语法整理

热门文章

  1. Android的第一个工程,Android Things:撸起袖子来创建第一个Things工程
  2. numpy 矩阵求逆_numpy 矩阵运算
  3. sql去除字符串中首尾空格
  4. kibana数据导入导出_MySQL数据库批量导出和导入查询数据
  5. 中国医科大学计算机应用基础本科在线作业,17秋中国医科大学《计算机应用基础(本科)》在线作业...
  6. java里的进制转换函数_基于Java中进制的转换函数详解
  7. char* 去除后面几个字符_【算法打卡】去除重复字母
  8. html代码js正则,过滤所有HTML代码和CSS,JS
  9. linux .run文件_Linux快捷键及目录结构
  10. mysql启用keepalive_mysql主从之keepalive+MySQL高可用