Tomcat 是什么
开源的 Java Web 应用服务器,实现了 Java EE(Java Platform Enterprise Edition)的部分技术规范,比如 Java Servlet、Java Server Page、JSTL、Java WebSocket。Java EE 是 Sun 公 司为企业级应用推出的标准平台,定义了一系列用于企业级开发的技术规范,除了上述的之外,还有 EJB、Java Mail、JPA、JTA、JMS 等,而这些都依赖具体容器的实现。
上图对比了 Java EE 容器的实现情况,Tomcat 和 Jetty 都只提供了 Java Web 容器必需的 Servlet 和 JSP 规范,开发者要想实现其他的功能,需要自己依赖其他开源实现。
Glassfish 是由 Sun 公司推出,Java EE 最新规范出来之后,首先会在 Glassfish 上进行实 现,所以是研究 Java EE 最新技术的首选。
最常见的情况是使用 Tomcat 作为 Java Web 服务器,使用 Spring 提供的开箱即用的强大 的功能,并依赖其他开源库来完成负责的业务功能实现。
Servlet 容器
Tomcat 组成如下图:主要有 Container 和 Connector 以及相关组件构成。
Container 组成
生命周期管理
Tomcat 为了方便管理组件和容器的生命周期,定义了从创建、启动、到停止、销毁共 12 中状态,Tomcat 生命周期管理了内部状态变化的规则控制,组件和容器只需实现相应的生命周期 方法即可完成各生命周期内的操作(initInternal、startInternal、stopInternal、 destroyInternal)。
比如执行初始化操作时,会判断当前状态是否 New,如果不是,则抛出生命周期异常;如果是,则设置当前状态为 Initializing,并执行 initInternal 方法,由子类实现,方法执行成功则设置当 前状态为 Initialized,执行失败则设置为 Failed 状态。
Tomcat 的生命周期管理引入了事件机制,在组件或容器的生命周期状态发生变化时会通知事件监听器tomcat与java web开发技术详解,监听器通过判断事件的类型来进行相应的操作。事件监听器的添加可以在 server.xml 文件中进行配置。
Tomcat 各类容器的配置过程就是通过添加 listener 的方式来进行的,从而达到配置逻辑与容器的解耦。如 EngineConfig、HostConfig、ContextConfig。
Tomcat 的启动过程
启动从 Tomcat 提供的 start.sh 脚本开始,Shell 脚本会调用 Bootstrap 的 main 方法,实际调用了 Catalina 相应的 load、start 方法。
load 方法会通过 Digester 进行 config/server.xml 的解析,在解析的过程中会根据 xml 中的关系和配置信息来创建容器,并设置相关的属性。接着 Catalina 会调用 StandardServer 的 init 和 start 方法进行容器的初始化和启动。
按照 xml 的配置关系,server 的子元素是 service,service 的子元素是顶层容器 Engine,每层容器有持有自己的子容器,而这些元素都实现了生命周期管理 的各个方法,因此就很容易的完成整个容器的启动、关闭等生命周期的管理。
StandardServer 完成 init 和 start 方法调用后,会一直监听来自 8005 端口(可配置),如果接收到 shutdown 命令,则会退出循环监听,执行后续的 stop 和 destroy 方法,完成 Tomcat 容器的关闭。同时也会调用 JVM 的 Runtime.getRuntime()﴿.addShutdownHook 方法,在虚拟机意外退出的时候来关闭容器。
所有容器都是继承自 ContainerBase,基类中封装了容器中的重复工作,负责启动容器相关的组 件 Loader、Logger、Manager、Cluster、Pipeline,启动子容器(线程池并发启动子容器,通过线程池 submit 多个线程,调用后返回 Future 对象,线程内部启动子容器,接着调用 Future 对象的 get 方法来等待执行结果)。
<p><pre class="has">List results = new ArrayList();
for (int i = 0; i