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。

时间: 2024-10-06 21:41:56

How Tomcat works — 三、tomcat启动(2)的相关文章

攻城狮在路上(肆)How tomcat works(三) 连接器:Connector

在介绍中提到,Catalina中有两个主要的模块:连接器和容器.本章中你将会写一个可以创建更好的请求和响应对象的连接器,用来改进第2章中的程序.一个符合Servlet 2.3和2.4规范的连接器必须创建javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse,并传递给被调用的servlet的service方法. 在本章的应用程序中,连接器解析HTTP请求头部并让servlet可以获得头部, cooki

How Tomcat works — 四、tomcat启动(3)

上一节说到StandardService负责启动其子组件:container和connector,不过注意,是有先后顺序的,先启动container,再启动connector,这一节先来看看container. 目录 Pipeline和Vavle StandardEngine类和StandardHost类 StandardContext类 总结 Pipeline和Vavle 在第二节(How Tomcat works — 二.tomcat启动(1))中没有介绍关于Pipeline和Vavle,因

How Tomcat works — 二、tomcat启动(1)

主要介绍tomcat启动涉及到的一些接口和类. 目录 概述 tomcat包含的组件 Lifecycle Container Connector 总结 概述 tomcat作为一个服务器,它的主要功能就是接收请求——处理请求——返回,如果是我们自己实现一个最简单的服务器,启动一个线程监听某个端口,该端口有数据进来的话就接收数据,然后在启动一个线程去处理接收到的数据并返回.那么启动一个服务器最重要的就是启动一个线程监听某个端口,tomcat也是,只不过tomcat包含很多组件,首先要完成组件的初始化,

how tomcat works 读书笔记四 tomcat的默认连接器

其实在第三章,就已经有了连接器的样子了,不过那只是一个学习工具,在这一章我们会开始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足以下几个要求 1 实现org.apache.cataline.Connector接口 2 负责创建实现了org.apache.cataline.Request接口的request对象 3 负责创建实现了org.apache.cataline.Response接口的response对象 这里默认的连接器的原理很简单,就是等待http请求,创建re

TOMCAT源码分析(启动框架)

建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, 是不那么容易掌握TOMCAT的框架的. 所以得实践.实践.再实践. 建议下载一份TOMCAT的源码, 调试通过, 然后单步跟踪其启动过程. 如果有不明白的地方, 再来查阅本文, 看是否能得到帮助. 我相信这样效果以及学习速度都会好很多! 1. Tomcat的整体框架结构 Tomcat的基本框架, 分为4个层次. Top Level Elements: Server Service Connector HTTP AJP Conta

Tomcat:解决Tomcat可以在eclipse启动,却无法显示默认页面的操作

解决Tomcat可以在eclipse启动,却无法显示默认页面的操作 今天在eclipse中配置好tomcat后访问不到它的主页,但是能运行自己的项目,一直找不到原因,百度之后最后解决了这个问题,总结如下: 原因在于eclipse是调用Tomcat的接口模拟tomcat而不是真正的启动它,因此显示不了Tomcat主页 解决办法如下: 一:双击控制台的Tomcat,如图所示: 二:修改以下两个地方: 三:若上图的单选框修改不了,如图所示: 那么最简单的解决办法就是:右击控制台的Tomcat选dele

JavaWeb学习总结(三)——Tomcat服务器学习和使用(二) 包含https 非对称秘钥 NB

JavaWeb学习总结(三)--Tomcat服务器学习和使用(二) 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下: 范例:将JavaWebDemoProject这个JavaWeb应用打包成war包 执行完之后,就可以得到一个文件,平时开发完JavaWeb应用后,一般都会将JavaWeb应用打包成一个war包,然后将这个war包放到Tomcat服务器的webapps目录下,当Tomcat服务器启动时,就会自动

将项目部署到tomcat的三种方法

2014年8月初8    星期五 又到星期五了,可以轻松的敲点东西,不担心睡太晚起不来,或者起来后上班打瞌睡. 由于近期学习了solr相关的知识,部署solr项目到tomcat上的方式很多,包括官方的等.我自己也找了中非官方的方法,感觉很好.而且以前用MyEclipse开发,出错很少,现在用Eclipse所以部署项目后在后台调用user.dir的时候出错,试了一下午也没事出来,而且越试越想试,但是带我的人不让我弄了,他帮我弄,让我干其他任务,我都怀疑是不是他也和我一样就喜欢干这种事情,所以自己去

eclipse中项目已经启动,可是tomcat一直显示在启动中

一.异常描述 1. 在eclipse中启动tomcat,应用已经启动成功,但是tomcat仍然一直处于starting装填 二.分析原因 1. 更换8080端口为9080,启动tomcat,可以完整启动.证明是8080端口问题: 2. 但是8080端口并没有被占用: 3. 在网上搜索可能原因,可能原因是打开了代理,导致端口被占用: http://www.cnblogs.com/winkey4986/p/3303412.html http://zhangzhaoaaa.iteye.com/blog