【Tomcat源码学习】-2.容器管理
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。
- *.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方法停止
- 整体是通过Digester读取conf/server.xml配置文件,加载各容器组件从配置文件至java对象堆中
- Service在装载过程默认新建一个MapperListener监听对象
- Host在装载过程默认新建一个HostConfig监听对象
- Context在装载过程新建一个ContextConfig监听对象
3)容器组件初始化
- 由于容器基本上都继承与抽象类LifecycleMBeanBase,因此在装载过程中都需要将这些对象视为Mbean注入JVM中
- Service初始化时,调用MapperListener的初始化方法
- Engine容器初始化时,会初始化startStopExecutor线程池,用户进程的监控的处理
- Service启动时,调用MapperListener的启动方法
- MapperListener启动时,将Engine及所有子容器注册该监听,同时将所有的host,context注入到该监听内容中,另外看Context下是否配置有Wapper描述信息,如果有构建WrapperMappingInfo,供后续生成Wrapper时使用
- Engine启动时,启动Cluster,Realm,通过startStopExecutor线程池启动Host子组件,执行监听
- Host启动时,启动Cluster,Realm,通过startStopExecutor线程池启动Context子组件,执行监听,其中会调用HostConfig进行应用程序读取,具体加载会在下一章节进行讲解。
- 在通过HostConfig进行应用程序加载后,调用Context子容器进行应用加载,具体加载会在下一章节进行讲解。
转载于:https://www.cnblogs.com/hframe/p/5318278.html
【Tomcat源码学习】-2.容器管理相关推荐
- Tomcat源码学习(一)
Tomcat源码学习(一) 已有 9159 次阅读 2008-3-13 03:10 |个人分类:Tomcat|系统分类:开发 http://blog.ccidnet.com/home.php?mod= ...
- Tomcat源码分析(九)--Session管理
本系列转载自 http://blog.csdn.net/haitao111313/article/category/1179996 在明白Tomcat的Session机制之前,先要了解Session, ...
- tomcat源码学习
2019独角兽企业重金招聘Python工程师标准>>> 1.下载源码 在eclicpse 用svn导入源码 http://svn.apache.org/repos/asf/tom ...
- Box2d源码学习二内存管理之SOA的实现
本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.csdn.net/cg0206/article/details/8258166 SOA,全称small object al ...
- (精)tomcat 源码学习
Tomcat6是最新版本的web容器,其支持最新版本的servlet2.5和jsp2.1.而且Tomcat6架构也是经过重新设计优化过的,所以我们有必要分析一下它的架构过程.显然,这是一个通过阅读To ...
- Tomcat源码学习(9)-How Tomcat works(转)
第2章:一个简单的Servlet容器 概要 本章通过两个程序来说明你如何开发自己的servlet容器.第一个程序被设计得足够简单使得你能理解一个servlet容器是如何工作的.然后它演变为第二个稍微复 ...
- tomcat源码阅读之session管理器(Manager)
一.UML图分析: (一) Session: Session保存了一个客户端访问服务器时,服务器专门为这个客户端建立一个session用来保存相关的会话信息,session有一个有效时间,这个时间默认 ...
- Tomcat源码学习(4)-How Tomcat works(转)
ServerSocket类 Socket类代表一个客户端套接字,即任何时候你想连接到一个远程服务器应用的时候你构造的套接字,现在,假如你想实施一个服务器应用,例如一个HTTP服务器或者FTP服务器,你 ...
- Tomcat源码学习(7)-How Tomcat works(转)
Response类 ex01.pyrmont.Response类代表一个HTTP响应,在Listing 1.6里边给出. Listing 1.6: Response类 package ...
最新文章
- 执行appium程序时遇到如下报错,ImportError: cannot import name 'InvalidArgumentException',...
- Emscripten-mac安装与升级
- 【SAS BASE】SCAN函数
- 分布式查询处理和优化相关知识介绍
- 入手5G手机别太急!国内部分5G手机可能有网没信号
- PL/SQL 调用JAVA使用UDP发送数据
- Linux里安装ghostscript
- [原创]Javascript 利用mousetrap.js进行键盘事件操作
- 5G笔记| 概述:5G三大应用场景、5G关键技术概览
- 计算机上怎么计算x的n次方,计算x的n次方(用函数)
- Linux WIFI模块驱动移植
- jquery ui 拖拽
- IDEA精选插件使用,建议收藏
- python安装报错,Windows 7 Service Pack 1 and all applicable updates
- SpringMVC从基础到源码
- 系分 - 计算机组成与体系结构
- 如何在cmd中运行PHP
- 用Bootstrap框架制作下拉列表
- 对于 C 源文件,IntelliSenseMode 已根据编译器参数和查询 compilerPath 从“windo
- 前端ES6的语法整理
热门文章
- Android的第一个工程,Android Things:撸起袖子来创建第一个Things工程
- numpy 矩阵求逆_numpy 矩阵运算
- sql去除字符串中首尾空格
- kibana数据导入导出_MySQL数据库批量导出和导入查询数据
- 中国医科大学计算机应用基础本科在线作业,17秋中国医科大学《计算机应用基础(本科)》在线作业...
- java里的进制转换函数_基于Java中进制的转换函数详解
- char* 去除后面几个字符_【算法打卡】去除重复字母
- html代码js正则,过滤所有HTML代码和CSS,JS
- linux .run文件_Linux快捷键及目录结构
- mysql启用keepalive_mysql主从之keepalive+MySQL高可用