How Tomcat works — 三、tomcat启动(2)
在了解了tomcat 的一些基本组件之后,学习启动过程就更容易理解了,因为启动过程就是启动各个组件。
目录
- 启动顺序
- Bootstrap类
- Catalina类
- StandardServer类和StandardService类
- 总结
启动顺序
tomcat的启动主要是容器的启动,根据tomcat四层架构,启动时由上而下的,而service包含这些组件,service又包含在server里面,启动顺序如下:

Bootstrap类
整个tomcat程序的入口——main函数,主要作用就是找到CATALINA_HOME,实例化Catalina类,并调用load和start进行整个服务器的初始化和启动

(上图中最后还有一个start调用,由于图太高了没有截)
main函数中new出了Bootstrap实例,主要执行了以下方法
- init:设置catalinaHome和catalinaBase(和catalinaHome一样)为bootstrap.jar的上一级目录,初始化tomcat的classLoader,获得Catalina的实例(后面load和start都调用了Catalina的方法)
- setAwait:调用Catalina的setAwait设置服务器处于等待标志
- load:调用Catalina的load方法进行服务器的初始化
- start:调用Catalina的start方法启动服务器
Catalina类
主要作用是初始化并启动 StandardServer
load
load主要执行以下方法:
- initDir:再次检查设置catalinaHome
- initNaming:设置系统变量表明是否使用naming
- createStartDigester:新建一个Digester解析server.xml,用来初始化StandardServer

(最左边的是catalina)
这里面最重要的就是createStartDigester方法(方法内部是添加一系列对应rule,要理解这个函数的实现要先去学习digest解析xml库),tomcat使用用来解析xml 的digest库,可以根据xml来生成对应的类并初始化:
- digester.push(this):将catalina压在栈底(digester使用栈来解析xml),为了将StandardServer设置为catalina的变量(后面用到了StandardServer的init和start方法)
- digester.parse():解析service.xml
经过上面得到一个StandardServer的实例以后,调用StandardServer.init方法进行StandardServer的初始化。
start
start函数主要进行了以下操作:
- 先判断getServer是否为null,若是则再次调用load进行初始化
- 如果依然初始化失败则表明服务器初始化失败直接返回
- getServer.start:调用StandardServer的start方法进行服务器初始化
- 注册关闭服务器钩子(如果服务器没有正常关闭,该钩子可以进行关闭和清理工作)
- 最后调用StandardServer的await方法监听端口等待关闭命令
- 因为await方法是阻塞方法(等待socket),等await方法执行完成的时候(表明接收到shutdown命令)使用stop进行关闭服务器
StandardServer类和StandardService类
因为server和service联系紧密所以放到一块来说,server的主要任务是初始化并启动所有的service(如果有多个的话)
StandardServer.init
在catalina的load方法中调用了StandardServer的init方法,但是StandardServer没有重载超类LifeBase的init方法,所以是直接执行LifeBase.init方法

最后会调用到StandardServer的initInternal方法,在该方法中进行了以下操作:
- 调用父类LifecycleMBeanBase.initInternal方法进行注册MBean
- 从低向上逐级验证tomcat类加载器
- 使用循环逐个初始化service(在解析serverx.xml的时候已经实例化StandardService并调用StandardServer.addService()添加到StandardServer.services变量中),在标准server.xml配置中只有一个service——StandardService,所有就是只调用StandardService.init()
StandardService.init
最后也会调用到StandardService的initInternal方法,在该方法中进行了以下操作:
- 调用父类LifecycleMBeanBase.initInternal方法进行注册MBeang
- 如果container(这里的container是StandardEngine)不是null,则调用container的init方法进行初始化
- 如果有Executor则逐个初始化
- 最后使用循环逐个在初始化Connector,这里connector有两个,分别是用来处理两种协议:http和ajp
StandardServer.start

最后会调用StandardServe.startInternal,执行以下操作
- 触发listener
- 启动globalNamingResource
- 启动所有service
StandardService.start
最后会调用到StandardService的startInternal,执行以下操作:
- setState设置service的状态,并通知所有listener
- 启动container
- 启动executor
- 启动connector(和初始化的时候一样)
总结
上一节说过StandardServer和StandardService的作用,但是经过这一节才更明白,service负责初始化并启动了container、executor和connector,所以接下来主要是分析StandardService如何启动container和connector。
How Tomcat works — 三、tomcat启动(2)的更多相关文章
- 攻城狮在路上(肆)How tomcat works(三) 连接器:Connector
在介绍中提到,Catalina中有两个主要的模块:连接器和容器.本章中你将会写一个可以创建更好的请求和响应对象的连接器,用来改进第2章中的程序.一个符合Servlet 2.3和2.4规范的连接器必须 ...
- How Tomcat works — 四、tomcat启动(3)
上一节说到StandardService负责启动其子组件:container和connector,不过注意,是有先后顺序的,先启动container,再启动connector,这一节先来看看conta ...
- tomcat 解析(三)-启动框架
TOMCAT源码分析(启动框架)前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教!建议: 毕竟TOMCAT的框 ...
- How Tomcat Works(三)
上文中描述的简单的服务器是不符合Servlet规范的,所以本文进一步描述一个简单的Servlet容器是怎么实现的 所以我们首先要明白Servlet接口规范,规范有不同版本,本人就先一视同仁了: pub ...
- How Tomcat works — 二、tomcat启动(1)
主要介绍tomcat启动涉及到的一些接口和类. 目录 概述 tomcat包含的组件 server和service Lifecycle Container Connector 总结 概述 tomcat作 ...
- How Tomcat Works(十一)
本文接下来分析tomcat的类载入器,tomcat需要实现一个自定义的载入器,而不能使用系统类载入器 (1)限制serlvet访问当前运行的java虚拟机中环境变量CLASSPATH指明的路径下的所有 ...
- How Tomcat Works(九)
本文接下来描述servlet容器是怎样管理其相关组件的生命周期的,首先本人描述一下事件监听模式,也可以称为观察者模式,该模式分为以下角色 即抽象主题角色 具体主题角色 抽象观察者角色及具体观察者角色, ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- how tomcat works 总结
希望各位网友在看完<<how tomcat works>>一书或者鄙人的tomcat专栏文章后再看这篇博客 这里主要是梳理各个章节的核心概念 第一章 一个简单的Web服务器 第 ...
随机推荐
- jquery学习总结24-36
一.jquery的自定义事件 1.自定义事件不能通过eventName()来添加,只能通过on来绑定 2.自定义事件需要通过trigger(自动触发)来进行触发 二.jauery事件命名空间 1.事件 ...
- Django项目及应用的创建
一.url解释 1url是全球资源定位符,网上的每个文件都有唯一的url地址,组成:协议.服务器名称(或IP地址).路径和文件名. 2有时候,URL以斜杠“/”结尾,而没有给出文件名,在这种情况下,U ...
- Nginx服务器中配置非80端口的端口转发方法详解
这篇文章主要介绍了Nginx服务器中配置非80端口的端口转发方法详解,文中使用到了Nginx中的proxy_pass配置项,需要的朋友可以参考下 nginx可以很方便的配置成反向代理服务器: 1 2 ...
- php 与 memcache 笔记
一:安装 Memcache是什么Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力.它 ...
- 解决jenkins shell执行sonar-scanner提示命令存在的问题
通过jenkins的以下三个方式去执行sonar-scanner,抛如下错误. Send files or execute commands over SSH before the build sta ...
- windows 子系统 linux wsl 开启ssh 服务
原因 windows自带的终端操作丑陋,习惯xshell的操作 步骤 1.关闭windows自带的ssh服务,这个占用了22端口 2.wsl 安装ssh服务(使用的是ubuntu) sudo apt ...
- template模板的使用方法
模板 WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用. 定义模板 使用name属性,作为模板的名字.然后在<template/>内定义代码片段 使用模 ...
- C# 服务开发
1. 执行权限 对于一般服务项目,需要使用管理员权限打开Visual Studio.右击项目 -> 属性 -> 安全性,如下图: 勾选红框中部分,项目中会增加文件 app.mainfest ...
- Leetcode11 Container With Most Water 解题思路 (Python)
今天开始第一天记录刷题,本人编程小白,如果有写的不对.或者能更完善的地方请个位批评指正! 准备按tag刷,第一个tag是array: 这个是array的第一道题:11. Container With ...
- Java基础知识提要
1. 简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等 2. 简单写出Java特 ...