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

简介: 我们知道Tomcat的架构设计是清晰的、模块化的,其拥有很多组件,假如我们要启动Tomcat,可以一个一个启动组件,但这样启动有很多缺点,不仅麻烦,而且容易漏了组件启动,还会对后面动态组件扩展带来麻烦。

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

从第一节的架构图可以看到各个核心组件有包含与被包含的关系,例如Server<-Service<-ContainerConnector,最大的是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其实就是定义了一些状态常量跟几个方法,这里主要看下initstartstop三个方法,所有需要被生命周期管理的容器都要实现这个接口,并且各自被父容器的相应方法调用,例如在初始化阶段,根容器Server会调用init方法,而在init方法里会调用它的子容器Serviceinit方法,以此类推。

在实际使用中,一般只有统一实现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内核设计剖析》




目录
相关文章
|
关系型数据库 MySQL Linux
【Linux】jdk & Tomcat & MySql的安装及Linux后端接口部署
【Linux】jdk & Tomcat & MySql的安装及Linux后端接口部署
345 0
|
9月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
612 17
|
9月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
257 18
|
9月前
|
开发框架 关系型数据库 Java
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
286 10
|
设计模式 人工智能 安全
【Tomcat源码分析】生命周期机制 Lifecycle
Tomcat内部通过各种组件协同工作,构建了一个复杂的Web服务器架构。其中,`Lifecycle`机制作为核心,管理组件从创建到销毁的整个生命周期。本文详细解析了Lifecycle的工作原理及其方法,如初始化、启动、停止和销毁等关键步骤,并展示了LifecycleBase类如何通过状态机和模板模式实现这一过程。通过深入理解Lifecycle,我们可以更好地掌握组件生命周期管理,提升系统设计能力。欢迎关注【码上遇见你】获取更多信息,或搜索【AI贝塔】体验免费的Chat GPT。希望本章内容对你有所帮助。
|
应用服务中间件
前后端数据交互之axios的路径怎样找?axios的路径是那个,是你打开Tomcat之后,出现的路径+你项目写的接口路径
前后端数据交互之axios的路径怎样找?axios的路径是那个,是你打开Tomcat之后,出现的路径+你项目写的接口路径
|
前端开发 关系型数据库 MySQL
J2EE项目部署与发布(Linux版本)->jdk&tomcat安装,MySQL安装,后端接口部署,linux单体项目前端部署
J2EE项目部署与发布(Linux版本)->jdk&tomcat安装,MySQL安装,后端接口部署,linux单体项目前端部署
238 0
|
关系型数据库 MySQL Java
Linux系统jdk&Tomcat&MySQL安装以及J2EE后端接口部署
Linux系统jdk&Tomcat&MySQL安装以及J2EE后端接口部署
192 0
|
应用服务中间件 Windows
使用nssm管理tomcat服务操作步骤
使用nssm管理tomcat服务操作步骤
771 0
|
设计模式 前端开发 应用服务中间件
拆解Tomcat10: (六) 核心组件的生命周期管理与组合模式解析(二)
上一篇《拆解Tomcat10 (五) 核心组件的初始化与设计模式解析》分享了Tomcat的核心组件的是如何实现生命周期接口的,以及生命周期方法的调用逻辑。如果把Tomcat比作一台机器,那么这台机器是如何开机、关机的呢? 当按下开机键,所有核心组件会逐步初始化、启动;当按下关机键,所有组件又会随着关机,释放资源,这是如何实现的呢?
1272 0
拆解Tomcat10: (六) 核心组件的生命周期管理与组合模式解析(二)