tomcat6源码分析二(初始化和启动流程)

本节主要使用时序图阐述tomcat的启动流程。Tomcat有两种启动方式:一种从Bootstrap启动,一种是从Catalina启动。Bootstrap和Catalina类都有入口main函数。这里以Bootstrap启动为例分析。

生命周期管理(Lifecycle接口)

  • Tomcat中核心组件都有生命周期,那么tomcat又是如何管理这些组件的生命周期呢?为方便管理这些组件的生命周期,tomcat设计了Lifecycle接口,需要生命周期管理的组件都需要实现这个接口。
  • addLifecycle接口添加事件监听者,在调用start/stop时后向监听者发送消息。Start/stop两个接口负责组件的启动和停止。只要组件实现了这个接口,就可以通过这两个接口完成自我生命周期的管理。

图1 Lifecycle接口

图12 Lifecycle接口模块关系类图

启动流程(init流程)

Bootstrap初始化流程

图3  tomcat初始化和启动总流程

Tomcat启动入口为Bootstrap main函数,依次调用Catalina、StandardServer、StandardService的init/start函数完成初始化和启动流程。初始化时,tomcat使用反射机制依据配置文件配置实例化相应类,并完成核心模块依赖注入工作。这些工作在Catalina.load函数中完成。

这里简单讲下Catalina.load函数工作流程:

  • 设置catalina.home /catalina.base
  • 实例化Digester(配置文件解析类)
  • 读取配置文件(server.xml),使用Digester解析,生成各个类实例,调用set函数设置实例依赖的模块。到这里tomcat生成了StandardServer、StandardService、StandardEngine、StandardContext等实例。
  • 调用StandardServer.initialize()完成初始化工作。


StandardService初始化流程

图4 StandardService启动流程

ServerSocketFactory是一个工厂类,调用createSocket生成ServerSocket实例,调用serverSocket.accept函数监听端口监听用户请求。完成初始化工作,依次调用各个模块的start函数启动服务。到此tomcat初始化流程结束。下面分析tomcat启动流程。

启动流程(start流程)

图3中上半部分是tomcat初始化流程,下半部分是tomcat的启动流程。这里接图3开始向后分析。

图5 StandardService启动流程核心代码

StandardService启动分为三个阶段:(1)启动所有子容器(StandardEngine),一个Service共享一个 StandardEngine(2)启动所有Executor,一般一个Service共享一个 Executor。如果没有Executor,tomcat会创建一个线程池处理连接。(3)启动所有Connector。

Excutor不是本次分析的重点,这里就跳过了。下面依次分析StandardEngine和Connector启动流程。

子容器启动流程

图6 容器启动流程

StandardWrapper对应一个Servlet,是对Servlet的封装。tomcat会缓存这个Wrapper,以后会复用这个wrapper,所以servlet只会在启动时被初始化一次,即servlet的init函数只会被调用一次。

Connector启动流程

图7 Connector启动流程

  • JIoEndpoint中由线程池和Acceptor组成。new WorkerStasck创建一个线程池,线程池中是工作线程Worker,每个Worker负责处理一个socket。Acceptor负责接收用户请求、建立socket连接并返回socket,然后从线程池中取出可用Worker处理。
  • server.xml中Connector元素的属性maxThreads表示线程池中线程上限。注意:在没有配置Excutor元素时,JIoEndpoint才会创建这个线程池;否则tomcat会优先使用Executor线,此时Connector中线程相关配置不生效。
  • 每个JIoEndpointer可以有多个Acceptor,默认值是1。Acceptor是一个线程,启动所有的Acceptor后,tomcat的启动工作完成。

到此tomcat的初始化和启动流程完成,可以对外提供服务。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值