前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tomcat的生命周期管理简要分析

Tomcat的生命周期管理简要分析

作者头像
Java后端技术
发布2018-08-09 10:52:47
6050
发布2018-08-09 10:52:47
举报
文章被收录于专栏:Java后端技术栈Java后端技术栈

在上一篇文章中:Tomcat服务器顶层结构和启动过程 对Tomcat的整体架构有了一个大致的了解,这一篇主要是学习一下Tomcat的整个生命周期的管理。

Tomcat的生命周期管理使用了观察者模式,使Tomcat的生命周期管理机制设计的非常优雅,在Tomcat启动时,只需要启动一个Server组件,就会启动所有的容器及对应的组件,并且触发这些容器的监听者,完成启动过程的设置。可以说是“一键式”启动的。停止过程也是一样。

一、观察者模式简单描述

(1)观察者模式有时被称作:发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

观察者模式的应用非常广泛,如Java AWT事件模型,Servlet的监听器,spring事件处理机制以及Tomcat生命周期管理机制等等。

(2)观察者模式解决的问题

将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。

(3)观察者模式中有3类角色对象:

1、抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

2、具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

3、抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

4、具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。 (4)观察者模式的类图:

二、Tomcat的生命周期管理相关类

关于Tomcat的生命周期管理所涉及的相关类主要有:

(1)Lifecycle:相当于抽象主题角色,所有的容器类与组件实现类都实现了这个接口。如StandardContext

(2)LifecycleListener:相当于抽象观察者角色,具体的实现类有ContextConfig, HostConfig, EngineConfig类,它们在容器启动时与停止时触发。

(3)LifecycleEvent:生命周期事件,对主题与发生的事件进行封装。

(4)LifecycleSupport:生命周期管理的实用类,提供对观察者的添加,删除及通知观察者的方法。(Tomcat release 9.0.x版本中没有用到这个)

(5)LifecycleException:生命周期异常类。

三、Lifecycle接口介绍

组件生命周期方法的通用接口。org.apache.catalina.Lifecycle Tomcat通过Lifecycle接口统一管理生命周期,所有有生命周期的组件都要实现Lifecycle接口,以便提供一致的机制去启动和停止组件。Lifecycle接口内容如下:

上图中可以看出Lifecycle接口一共做了四件事情:

(1)定义了13个String类型常量:这些常量信息用于LifecycleEvent事件的type属性中,作用是区分组件发出的LifecycleEvent事件是的状态(如初始化前、启动前、启动中等)。这种设计方法可以让多种状态都发送同一种类型的时间,然后用其中的一个属性类区分状态而不用定义多种事件。

(2)定义了3个管理监听器的方法:addLifecycleListener、findLifecycleListeners和removeLifecycleListener。分别用来添加、查找和删除LifecycleListener类型的监听器。源码如下图所示:

(3)定义了4个生命周期的方法:init、start、stop和destory,用于执行生命周期的各个阶段,接口定义如下:

(4)定义了获取当前和状态的两个方法: getState和getStateName,用来获取当前的状态,getState的返回值LifecycleState是枚举类型,里边列举了生命周期的各个节点,getStateName方法返回String类型的状态的名字。

完整的Lifecycle 接口定义代码如下:

四、Lifecycle接口默认实现LifecycleBase

Lifecycle接口的默认实现是org.apache.catalina.util.LifecycleBase ,在LifecycleBase实现类中实现了Lifecycle接口中定义的方法,类结构图如下:

(1)3个管理监听器的方法

可以看出LifecycleBase定义了一个lifecycleListeners 集合用于保存所有的监听器,然后并定义了添加、删除、查找和执行监听器的方法;

(2)4个生命周期的方法:init、start、stop和destory

这里对四个生命周期,只讨论init方法,其他三种大致相同。

在init方法中调用了所对应的模板方法initInternal() 该方法并没有具体的实现,而是让子类去具体的实现,因此对于子类来说,执行生命周期的方法就是:initInternal、startInternal、stopInternal、destroyInternal;

(3)定义了获取当前和状态的两个方法:getState和getStateName

在生命周期相应的方法中已经设置了state的属性,所以通过这两个方法就可以简单的实现获取state。

五、再谈Tomcat中的观察者模式

Tomcat中的观察者模式:

Tomcat中Lifecycle就是抽象的主题。

然后像StandardEngine、StandardHost、StandardContext、StandardServer这类Container对象,都是具体主题。

LifecycleListener定义了观察者想要执行的方法。就是前面提到的,如果观察者对主题的某个动作感兴趣,他就会做自己的动作,这个动作就是LifecycleListener里的方法。当然LifecycleListener是一个接口,用户可以定义各种具体的观察者。

Tomcat对观察者模式做了很好的扩展,他增加了一个LifecycleSupport来代替主题管理多个观察者,把功能模块分得更清晰,LifecycleSupport中定义了一个LifecycleListener的数组。主题中某动作发生时,LifecycleSupport会遍历此数组,对每一个listener调用它们像要做的方法。

下面的方法就是LifecycleSupport通知各个LifecycleListener某事件发生了。

Tomcat中将事件定义为LifecycleEvent

事件有一个属性type,用来标明事件的类型。

也就是说Tomcat中观察者模式流程: 1、将观察者listener增加到LifecycleSupport的listener数组中 2、当container(主题)做某些动作的时候,会生成一个LifecycleEvent对象,这个对象标明当前这个动作是一个什么事件,然后LifecycleSupport会通知listener数组中的每一个观察者该事件的发生。 3、listener会根据LifecycleEvent判断事件的类型,完成相应的动作。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、观察者模式简单描述
  • 二、Tomcat的生命周期管理相关类
  • 三、Lifecycle接口介绍
  • 五、再谈Tomcat中的观察者模式
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档