主要介绍tomcat启动涉及到的一些接口和类。

目录

  • 概述
  • tomcat包含的组件
  • server和service
  • Lifecycle
  • Container
  • Connector
  • 总结

概述

tomcat作为一个服务器,它的主要功能就是接收请求——处理请求——返回,如果是我们自己实现一个最简单的服务器,启动一个线程监听某个端口,该端口有数据进来的话就接收数据,然后在启动一个线程去处理接收到的数据并返回。那么启动一个服务器最重要的就是启动一个线程监听某个端口,tomcat也是,只不过tomcat包含很多组件,首先要完成组件的初始化,然后再依次启动各个组件。所以要知道tomcat 的启动过程,首先了解下tomcat的组件。

tomcat包含的组件

  • server和service:server用来启动和关闭服务器,包含服务器组件service,service包含其他组件
  • Lifecycle:管理整个tomcat的生命周期,包括start,stop。tomcat所有的组件都实现了该接口(或者继承了实现该接口的类)
  • Container:tomcat中最重要的部分,servlet的容器
  • Connector:tomcat的连接器,负责监听端口,接收请求并分发请求

其实还包括Processor、Session、Manager、Deployer等,但是在启动过程中,这些不是最重要的,在了解了整个过程之后在进行具体学习。

server和service

tomcat 提供了一种优雅的服务器启动和停止的方法,由server启动service组件,service启动所有包含的组件。service包含Container、Connector等组件。

Lifecycle

生命周期组件里面主要包含一个接口、一个类、一个enum:Lifecycle、LifecycleEvent、LifecycleState。

Lifecycle接口

接口org.apache.catalina.Lifecycle包含以下定义:

  • 管理生命周期的基本方法,如:start,stop
  • 对于组件listener的管理
  • 组件生命周期内可能会触发的事件,如:START_EVENT,STOP_EVENT等,每一个常量字符串对应一种LifecycleEvent

抽象类LifecycleBase实现了Lifecycle接口,主要提供了基本的start和stop实现,并增加了以下方法

  • 关于事件的:fireLifecycleEvent(protect,可以被子类重载、使用),用来触发该组件的所有Listener
  • 关于初始化子组件的:initInternal(protect),startInternal(protect)等,因为在tomcat的许多组件都是父子关系(比如:Engine和Host),这也是tomcat生命周期管理优雅的地方:每个组件负责启动自己的子组件或者相关组件(监听了该组件的某些事件START_EVENT等),所以tomcat只要启动最顶层的组件即可

抽象类LifecycleMBeanBase继承了LifecycleBase类,这个类实现了LifecycleBase的一些方法,提供了一些MBean的基本管理,tomcat提供了对JMX的支持。

LifecycleEvent类

org.apache.catalina.LifecycleEvent 继承自 java.util.EventObject ,表示lifecycle触发的事件,和事件紧密关联的就是listener了,所有想感知组件生命周期状态变化的类都要事先这个接口 (org.apache.catalina.LifecycleListener) 来监听对应的事件。事实上比如ContextConfig的初始化就是监听了Context的事件。

LifecycleEnum

提供了lifecycle的变化的各种状态,参考下图(tomcat javadoc

Container

其实tomcat作为servlet容器作重要的部分就是Container组件,Container组件是四层架构,类图如下:

简单介绍容器的四层架构:

  • Engine:在catalina容器架构中不是必要的,但是如果要使用一定是处于容器的最顶层,下面有一个或者多个Host(虚拟主机),engine负责将请求分发给对应的虚拟主机
  • Host:表示一个虚拟主机,下面有一个或者多个Context,Host负责将请求分发给对应的Context
  • Context:表示一个webapp,下面有一个或者多个Wrapper,负责将请求映射到对应的Wrapper
  • Wrapper:表示一个servlet,负责加载和初始化servlet

Connector

在刚开始我们说过了,自己实现服务器的话就是监听一个端口,接收请求,这也是tomcat Connector组件的作用,最后监听端口是由JIoEndpoint的一个内部类Acceptor来完成的,所以当JIoEndpoint$Acceptor线程启动的时候,整个tomcat服务器也就启动完成了。

tomcat支持http和ajp协议,所以提供了Http11Protocol和AjpProtocol来处理对应的协议(上面主要画出了http协议的部分)。

总结

以上是tomcat启动所涉及到的主要类和接口,当然了其中涉及到的远不止于此,但是一开始我也说了对于不同的目的,可以有针对性的学习,所以以上只关注了一些户主要的类。还有一个问题就是,我还是有点纠结的:其实我觉得记录的时候没有必要添加大段代码,因为这些代码都比较好懂,而且如果真要阅读的话可以随时找得到,当然了,对于一些很是重要或者经典的代码还是很有必要专门分析的。

在阅读的过程中记了一些笔记和绘制了一些图(这些在tomcat源码阅读的最后再附上),但是感觉都比较琐碎,经过这么一整理感觉更加明晰了。

How Tomcat works — 二、tomcat启动(1)的更多相关文章

  1. Tomcat学习(二)------Tomcat原理详解及请求过程

    Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat ...

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

    上一节说到StandardService负责启动其子组件:container和connector,不过注意,是有先后顺序的,先启动container,再启动connector,这一节先来看看conta ...

  3. How Tomcat Works(十二)

    tomcat容器通过一个称为Session管理器的组件来管理建立的Session对象,该组件由org.apache.catalina.Manager接口表示:Session管理器必须与一个Contex ...

  4. How Tomcat Works(二十)

    要使用一个web应用程序,必须要将表示该应用程序的Context实例部署到一个host实例中.在tomcat中,context实例可以用war文件的形式来部署,也可以将整个web应用拷贝到Tomcat ...

  5. How Tomcat Works(二)

    我们这些可怜虫,只有沿着大神的思路,这样我们才能进步得更快:因为我们不是跟大神处于同一级别上.所以我这里是参考<How Tomcat Works>这本英文版的大作来理解tomcat的工作原 ...

  6. how tomcat works 读书笔记(二)----------一个简单的servlet容器

    app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...

  7. How Tomcat works — 三、tomcat启动(2)

    在了解了tomcat 的一些基本组件之后,学习启动过程就更容易理解了,因为启动过程就是启动各个组件. 目录 启动顺序 Bootstrap类 Catalina类 StandardServer类和Stan ...

  8. How Tomcat Works(十八)

    在前面的文章中,如果我们要启动tomcat容器,我们需要使用Bootstrap类来实例化连接器.servlet容器.Wrapper实例和其他组件,然后调用各个对象的set方法将它们关联起来:这种配置应 ...

  9. How Tomcat Works(十七)

    在前面的文章中,已经学会了如何通过实例化一个连接器和容器来获得一个servlet容器,并将连接器和容器相关联:但在前面的文章中只有一个连接器可用,该连接器服务8080端口上的HTTP请求,无法添加另一 ...

随机推荐

  1. 解决.Net Core跨域问题

    什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 跨域的几种情况 1.端口和协议的不同,只能通过后台来解决 2.localhost和127.0.0.1虽然 ...

  2. 对python3中pathlib库的Path类的使用详解

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

  3. Codeforces Round #485 (Div. 2) F. AND Graph

    Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...

  4. Excel列A、B、C、D----与列序号的转换

    public static class ExcelConvert { public static int ToExcelIndex(this string columnName) { if (!Reg ...

  5. Python基础-数据类型-转摘

    1.数字 2 是一个整数的例子.长整数 不过是大一些的整数.3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4.(-5+4j)和(2.3-4. ...

  6. input type='file'文件上传自定义样式

    使用场景: 在未使用UI库时免不了会用到各种上传文件,那么默认的上传文件样式无法达到项目的要求,因此重写(修改)上传文件样式是必然的,下面的效果是最近项目中自己写的一个效果,写出来做个记录方便以后使用 ...

  7. POM文件详解(1)

    POM文件详解 <project xmlns=http://maven.apache.org/POM/4.0.0 xmlns:xsi="http://www.w3.org/2001/X ...

  8. Python Memo 赋值与ID (Assignment & id())

    利用Python内置函数id()找出内部地址,探讨赋值与内建地址. id()的官方解释:this is the address of the object in memory 那么 a =1 是什么意 ...

  9. 《JAVASCRIPT 高级程序设计》读书笔记六 面向对象的程序设计

    一   对象属性 a.对象定义: 无序属性的集合,其属性可以包含基本值.对象或者函数: b.两种创建方式: 1.构造函数: var person = new Object(); person.name ...

  10. Java开发面试题,3年工作经验的Java程序员面试经

    一.Java基础部分 1.使用length属性获取数组长度,public.private.protected.friendly区别 2.Collection和Collections区别 3.Strin ...