tomcat生命周期的管理——生命周期统一接口Lifecycle

我们知道Tomcat的架构设计是清晰的、模块化的,其拥有很多组件,假如我们要启动Tomcat,可以一个一个启动组件,但这样启动有很多缺点,不仅麻烦,而且容易漏了组件启动,还会对后面动态组件扩展带来麻烦。难不成真要我们一个一个启动吗?其实未必,Tomcat的设计者提供了一个解决方案:用Lifecycle管理启动、停止、关闭。

从第一节的架构图可以看到各个核心组件有包含与被包含的关系,例如Server<-Service<-Container和Connector,最大的是Server,往下一层层包含。其实Tomcat就是以容器的方式来组织整个系统架构的,反映到数据结构就是树,树的根节点没有父节点,其它节点有且仅有一个父节点,每个父节点有零个或多个子节点,根容器与其他容器也有这样的特点。鉴于如此,可以通过父容器负责启动它的子容器,这样只要启动根容器,即可把其他所有容器都启动,达到统一启动、停止、关闭的效果。

Lifecycle作为统一的接口,把所有的启动、停止、关闭、生命周期相关方法都组织到一起,就可以很方便地管理Tomcat各个容器组件的生命周期。下面是Lifecycle接口详细的定义:

public interface Lifecycle {

   public static final String BEFORE_INIT_EVENT = "before_init";

   public static final String AFTER_INIT_EVENT = "after_init";

   public static final String START_EVENT = "start";

   public static final String BEFORE_START_EVENT ="before_start";

   public static final String AFTER_START_EVENT = "after_start";

   public static final String STOP_EVENT = "stop";

   public static final String BEFORE_STOP_EVENT = "before_stop";

   public static final String AFTER_STOP_EVENT = "after_stop";

   public static final String AFTER_DESTROY_EVENT ="after_destroy";

   public static final String BEFORE_DESTROY_EVENT ="before_destroy";

   public static final String PERIODIC_EVENT = "periodic";

   public static final String CONFIGURE_START_EVENT ="configure_start";

   public static final String CONFIGURE_STOP_EVENT ="configure_stop";

   

   public void addLifecycleListener(LifecycleListener listener);

   public LifecycleListener[] findLifecycleListeners();

   public void removeLifecycleListener(LifecycleListener listener);

   public void init() throws LifecycleException;

   public void start() throws LifecycleException;

   public void stop() throws LifecycleException;

   public LifecycleState getState();

   public String getStateName();

}

从上面可以看出Lifecycle其实就是定义了一些状态常量跟几个方法,这里主要看下init、start、stop三个方法,所有需要被生命周期管理的容器都要实现这个接口,并且各自被父容器的相应方法调用,例如在初始化阶段,根容器Server会调用init方法,而在init方法里会调用它的子容器Service的init方法,以此类推。

在实际使用中,一般只有统一实现Lifecycle接口后才能实现统一调用,例如调用容器的init方法是这样子:((Lifecycle)容器).init()。下面简单看看Tomcat源码的Server是怎样调用init的。

 

publicfinalsynchronizedvoid init()throws LifecycleException {

……

for (int i = 0; i < services.length; i++) {

           services[i].init();

       }

 ……

}

 

Server容器里面有若干多个Service实例,那么只要用一个for循环即可分别让每个Service调用init方法。这里的services[i]并没有用(Lifecycle)显式转换类型,其实是因为Service也是一个接口,而这个接口已经继承了Lifecycle接口。

同样的,启动跟停止步骤也是通过类似的调用实现统一启动统一关闭。至此,我们对Tomcat的生命周期统一初始化、启动、关闭机制有了比较清晰的认识。

点击订购作者《Tomcat内核设计剖析》

时间: 2024-10-26 18:23:06

tomcat生命周期的管理——生命周期统一接口Lifecycle的相关文章

我所理解的Remoting(2):远程对象生命周期的管理[上篇]

1.CLR的垃圾回收机制 在.NET中提到对象的生命周期,我们会不由自主地想到CLR的垃圾回收.在运行一个.NET程序过程中,我们通过某种方式,比如通过new操作符,通过反序列化,通过反射机制,创建一个对象,CLR在为这个对象在托管堆中开辟一块内存空间.随着程序的运行,创建的对象越来越多,托管堆中的可用的内存越来越少,必须有一种机制来判断被分配在托管堆中的对象那些已经不被使用,以及进行对这些对象占用的内存进行回收.这种机制被称为CLR自动内存管理,也就是我们常说的垃圾回收.为了说清楚远程对象的生

使用IBM Rational Quality Manager对软件测试生命周期进行管理

对于http://www.aliyun.com/zixun/aggregation/10185.html">软件测试团队来说,选择一个好的测试管理工具往往能使测试工作事半功倍,基于 Jazz 平台的 IBM Rational Quality Manager(RQM)是一个协作性.基于 Web 的工具,它在软件开发的整个生命周期之内,提供了复杂的测试规划与测试评价管理方法.本文基于作者实际使用 RQM 过程中的最佳实践,详细地介绍在软件测试的整个生命周期内如何利用 RQM 来管理测试需求,测

红帽获评Gartner 2016年全生命周期API管理魔力象限领导者

近日,红帽公司3scale API管理平台表现卓越,在Gartner 2016年10月发布的全生命周期API管理魔力象限中,红帽位于"领导者"象限. Gartner的魔力象限基于对供应商的愿景完整性和执行能力做出的精密分析.Gartner认为,"全生命周期API管理是企业所需要的功能,他们将借此为数字业务提供技术平台,运行成功的API程序,并在API经济中蓬勃发展." 红帽3scale API管理平台是一套基于云计算的分布式平台,旨在为企业的API提供端到端管理功能

调用.net remoting返回的MarshalByRefObject类型的对象的生命期如何管理?如何释放这类远程对象占用的资源?

问题描述 调用.netremoting返回的MarshalByRefObject类型的对象的生命期如何管理?是和客户端激活远程对象一样使用生命周期服务吗?如何释放这类远程对象占用的资源?是否是使用析构函数? 解决方案 解决方案二:第一个问题我自己解决了,现在就剩第二个问题了

quartz 从长周期改为短周期的问题

问题描述 我用quartz进行定时任务,在程序执行的过程中要改变某个任务的周期,发现从短周期改为长周期没什么问题,但是从短周期改为长周期发生问题了,比如原来的周期是10秒钟一次,用了scheduler.rescheduleJob方法改变到5秒钟,这时候发现要过十秒钟才执行,但是执行的时候会连续执行两次 解决方案 解决方案二:没人吗解决方案三:不要沉啊解决方案四:Java深度探索者QQ群:65670864

Tomcat中session的管理机制_java

详细描述Tomcat中session的管理机制: 1. 请求过程中的session操作: 简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中.然后再从 request获取session的时候,如果存在sessionId那么就根据Id从session池中获取session,如果sessionId不 存在或者session失效,那么则新建session并且将session信息放入session池,供下次使用. (1)SessionId

Java RESTful Web Service实战(第2版) 2.1 统一接口

2.1 统一接口 REST服务和RPC服务在接口定义上的区别是:REST使用HTTP协议的通用方法作为统一接口的标准词汇,REST服务所提供的方法信息都在HTTP方法里,而RPC服务所提供的方法信息在SOAP/HTTP信封里(其封装的格式通常是HTTP或SOAP),每一个RPC式的Web服务都会公布一套符合自己商业逻辑的方法词汇. 阅读指南 本节示例源代码地址:https://github.com/feuyeux/jax-rs2-guide-II/tree/master/2.simple-ser

mysql、sqlserver、oracle分页,java分页统一接口实现

mysql.sqlserver.oracle分页,java分页统一接口实现  定义:pageStart 起始页,pageEnd 终止页,pageSize页面容量  oracle分页:  select * from ( select mytable.*,rownum num from (实际传的SQL) where rownum<=pageEnd) where num>=pageStart  sqlServer分页:             select * from ( select top

用协议来统一接口

用协议来统一接口   效果   源码 https://github.com/YouXianMing/ProtocolDesign // // CellHeightProtocol.h // TableViewDemo // // Created by YouXianMing on 15/6/17. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import <Foundation/Foundation.h> #impo