3. TOMCAT学习——TOMCAT的生命周期

第一章第2节:安全生命周期(识别→防护→检测→响应→恢复) 安全不是一次性的加固,而是一个动态演化的持续过程识别资产 → 采取防护 → 实施检测 → 响应异常 → 恢复业务这五个阶段,既可以用于宏观的企业安全体系建设,也可以用于具体如日志分析、应急响应、漏洞修复等微观任务上。 阅读详情

TOMCAT包含很多组件。这些组件需要跟随TOMCAT一起启动和关闭。如何达到这种目的呢?TOMCAT引入了生命周期的概念。

生命周相关的接口和类包括

1. org.apache.catalina.Lifecycle 
2. org.apache.catalina.LifecycleListener
3. org.apache.catalina.LifecycleEvent
4. org.apache.catalina.util.LifecycleSupport

下面分别介绍一下这些类
  • org.apache.catalina.Lifecycle

    生命周期接口。所有想要被生命周期体系管理的对象都要继承于它。
    下面是Lifecycle接口的主要方法。

    //添加事件监听器
    public void addLifecycleListener(LifecycleListener listener);
    //查找所有的事件监听器
    public LifecycleListener[] findLifecycleListeners();
    //删除事件监听器
    public void removeLifecycleListener(LifecycleListener listener);
    //启动
    public void start() throws LifecycleException;
    //停止
    public void stop() throws LifecycleException;
  • org.apache.catalina.LifecycleListener

    生命周期监听接口。每个继承Lifecycle的对象可以添加多个监听器。
    下面是LifecycleListener的主要方法。

    //这个方法的内容是监听器被通知时需要做的事
    public void lifecycleEvent(LifecycleEvent event);
  • org.apache.catalina.LifecycleEvent

    生命周期体系的事件类。TOMCAT的生命周期事件包括以下9种:

    • INIT_EVENT
    • START_EVENT
    • BEFORE_START_EVENT
    • AFTER_START_EVENT
    • STOP_EVENT
    • BEFORE_STOP_EVENT
    • AFTER_STOP_EVENT
    • DESTROY_EVENT
    • PERIODIC_EVENT

    这些事件类型定义在Lifecycle接口中。可以把LifecycleEvent理解成生命周期体系中的Bean对象,一个用于传递数据的数据结构。其属性如下

    //一个附加对象,没有实际用途,
    //可以理解为备注(TOMCAT中有些代码用这个对象来记录日志)
    //也可以直接忽略
    private Object data = null;

    //Lifecycle对象,触发事件的对象
    private Lifecycle lifecycle = null;
    
    //事件类型
    private String type = null;
  • org.apache.catalina.util.LifecycleSupport

    可以理解为助手类,实现了Lifecycle中除了start和stop之外的三个接口。其构造方法需要传入一个Lifecycle对象。在TOMCAT中很多Lifecycle的实例会使用LifecycleSupport类来为自己管理事件监听器。看一下LifecycleSupport的主要代码。

    //构造函数,持有一个Lifecycle的引用
    public LifecycleSupport(Lifecycle lifecycle) {
        super();
        this.lifecycle = lifecycle;
    }

    //Lifecycle的引用
    private Lifecycle lifecycle = null;

    //用于维护当前Liftcycle的监听器列表
    private LifecycleListener listeners[] = new LifecycleListener[0];
    
    //添加/移除监听器的时候需要加锁,这是加锁使用的锁对象
    private final Object listenersLock = new Object(); // Lock object for changes to listeners

    //添加监听器,向listeners中加入一个监听器对象
    public void addLifecycleListener(LifecycleListener listener) {
      synchronized (listenersLock) {
          LifecycleListener results[] =
            new LifecycleListener[listeners.length + 1];
          for (int i = 0; i < listeners.length; i++)
              results[i] = listeners[i];
          results[listeners.length] = listener;
          listeners = results;
      }
    }


    //返回监听当前对象的所有监听器
    public LifecycleListener[] findLifecycleListeners() {
        return listeners;
    }


    //触发监听器,传入要触发的监听器的类型
    public void fireLifecycleEvent(String type, Object data) {
        if (Lifecycle.INIT_EVENT.equals(type)) {
            state = "INITIALIZED";
        } else if (Lifecycle.BEFORE_START_EVENT.equals(type)) {
            state = "STARTING_PREP";
        } else if (Lifecycle.START_EVENT.equals(type)) {
            state = "STARTING";
        } else if (Lifecycle.AFTER_START_EVENT.equals(type)) {
            state = "STARTED";
        } else if (Lifecycle.BEFORE_STOP_EVENT.equals(type)) {
            state = "STOPPING_PREP";
        } else if (Lifecycle.STOP_EVENT.equals(type)) {
            state = "STOPPING";
        } else if (Lifecycle.AFTER_STOP_EVENT.equals(type)) {
            state = "STOPPED";
        } else if (Lifecycle.DESTROY_EVENT.equals(type)) {
            state = "DESTROYED";
        }
        LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
        LifecycleListener interested[] = listeners;
        for (int i = 0; i < interested.length; i++)
            interested[i].lifecycleEvent(event);
    }

    //移除监听器,在listeners中移除一个监听器对象
    public void removeLifecycleListener(LifecycleListener listener) {
        synchronized (listenersLock) {
            int n = -1;
            for (int i = 0; i < listeners.length; i++) {
                if (listeners[i] == listener) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;
            LifecycleListener results[] =
              new LifecycleListener[listeners.length - 1];
            int j = 0;
            for (int i = 0; i < listeners.length; i++) {
                if (i != n)
                    results[j++] = listeners[i];
            }
            listeners = results;
        }
    }


生命周期体系的使用

上面我们简单描述了一下生命周期体系中相关的一些类。接下来我们看一下这个体系的简单使用方法。

在这里插入图片描述

  1. MyLifecycle中初始化一个LifecycleSupport类。
  2. 在程序中使用LifecycleSupport的 addLifecycleListener 方法,为 MyLifecycle注册监听器。
  3. 当MyLifecycle的状态发生变化的时候,开发者就可以调用LifecycleSupport的 fireLifecycleEvent 方法触发事件,告知所有注册的监听器:“XXX事件发生了”。
  4. fireLifecycleEvent 方法会调用监听器(LifecycleListener)的 lifecycleEvent 方法来处理对应的事件。由于LifecycleListener只是个接口,所以具体的处理逻辑在监听器的实现类中实现。

再说说之前忽略的 start 和 stop 方法

TOMCAT容器的启动和关闭全都依赖于各容器的 start 和 stop 方法。众所周知TOMCAT的容器是有层级关系的,如: 父容器 Context 和子容器 Wrapper。Context容器启动的时候必须要去启动与他相关联的子容器Wrapper。而Context的启动又是由他的父容器来触发,以此类推。因此,TOMCAT启动时只需要调用最上层容器的 start 方法,同样的,关闭时也只需要调用最上层容器的 stop 方法。
如下图
在这里插入图片描述

当然TOMCAT完整的启动链肯定没有这么简单,但是我们在这里忽略其他细节,只关注 start 和 stop 方法。

第三篇:AMD 和 Intel 它像“乐高积木”一样,可以通过标准化的接口与其他部分组合,构建复杂系统。理解组件后,你会发现从操作系统到微服务,现代软件本质上都是组件的组合! 阅读详情

相关推荐

[CTFSHOW]JWT

文章目录前言JWT简介CTFSHOW Web345CTFSHOW Web346前置知识开始做题CTFSHOW Web347CTFSHOW Web348CTFSHOW Web349CTFSHOW Web350前置知识利用WP如何防御 前言 有些师傅向我咨询WP,索性就发了吧,其实早就写好了,只是懒,在github仓库里囤着 JWT简介 可以看看我的Github总结给自己看的,Y4tacker CTFSHOW Web345 首先打开题目,查看源码,接下来访问/admin被跳转回主页啥也没有发生 where is

Y4tacker的博客 6045

面试官:既然启动流程不太了解,那你知道Tomcat的生命周期是什么样子的么?

序言Tomcat的生命周期管理的话,我们不能总是从书中获取那些知识,而是结合实践,然后综合书中的内容,进行一层一层的深入分析,这样对自己记忆和理解都能更加的透彻。启动的时候的大家可以随便找一个zip版本的Tomcat,然后直接启动起来,我们来看看是个什么样子的,一月 11, 2021 10:16:24 上午 org.apache.coyote.AbstractProtocol init 信息: I...

十指波课堂的博客 432

Mid-360与FAST-LIO2实战:从点云采集到高精度建图全流程解析

本文详细解析了使用Livox Mid-360激光雷达与FAST-LIO2算法实现高精度实时建图的全流程。内容涵盖硬件准备、软件环境搭建、算法部署配置、数据采集实战,并重点探讨了多楼层场景下的参数调优与误差抑制策略,为机器人及无人机三维感知应用提供了实用指南。

prometheus9mon的博客 414

你可能不那么知道的Tomcat生命周期管理 | 博学谷狂野架构师

Lifecycle接口统一管理Tomcat生命周期。定义13个string类型常量,用于LifecycleEvent时间的type属性中,用于区分组件发出的LifecycleEvent事件时的状态。定义三个管理监听器的方法,addLifecycleListener、findLifecycleListeners、removeLifecycleListener。定义4个生命周期的方法,init、start、stop、destory,用于执行生命周期的各个阶段的操作。

博学谷狂野架构师的博客 633

IBM Storwize V3700存储维护实战:硬盘更换、电源模块热插拔与带外管理IP配置

在企业IT基础设施中,存储阵列是数据持久化的核心组件,其稳定运行直接关系到业务连续性。存储阵列通常采用RAID技术实现数据冗余,并通过热插拔、冗余电源等设计保障高可用性。带外管理则提供了独立于业务网络的硬件级监控与管理通道,是运维的关键手段。本次实战以一台IBM Storwize V3700存储阵列为例,详细记录了在业务低峰期,依据严谨的操作流程,对出现SMART预警的硬盘进行在线更换,并对有异响的冗余电源模块实施热插拔更换。针对管理界面强制要求设置VIP才能配置带外管理地址的限制,文章提供了通过SSH命令

weixin_29172963的博客 303

Zabbix Trigger actions访问出现500

本篇博客详细介绍了Zabbix访问'Trigger actions'出现的错误状况,访问界面出现500,并提供了解决方案。

格子的博客 562

对于生命周期的简单理解

对于生命周期的简单理解 这个生命周期哈,字面上理解就是 生命在空间内的一个存在到不存在的过程。是每一个生命体都具有的属性。 那么在前端这一行的生命周期,其实也大差不差,最早提出生命周期的就是react框架,react框架里面提出的生命周期是仿照人的生命周期来形成的,人的生命周期大致可以分为三部分,第一部分就是人的出生,也叫生命的诞生;第二部分叫人的成长,不断地成长,也叫...

Martin996的博客 634

ANSYS Maxwell:创建即用型 3D 轴向磁通电机模型

Magnet Length” 是磁体的径向长度。“Magnet Thickness” 是磁体的轴向长度。为了对 AFM 进行更详细的分析,用户需要在 ANSYS Maxwell 中运行 3D FEA 分析。对于 2D 模型,它们类似于 MotorCAD 中的模型,后者对等效的直线电机进行建模。单击“确定”后,将创建一个 3D Maxwell 模型。“长度”是转子铁的轴向长度。然后需要定义定子的“磁芯”尺寸和材料。“长度”是定子铁芯的轴向长度。“转子”# 的极数必须与“定子”中定义的磁极相同。

jkh920184196的博客 1930

Tomcat源码篇-生命周期的架构设计

Tomcat生命周期   在上篇文章中我们看到了Tomcat架构中的核心组件,而且各个组件都有各自的作用,各司其职,而且相互之间也有对应的父子关系,那么这些对象的创建,调用,销毁等操作是怎么处理呢?   也就是在Tomcat中的组件的对象生命周期是怎么管理的呢?针对这个问题,在Tomcat中设计了Lifecycle接口来统一管理Tomcat中的核心组件的生命周期,所以本文我们就系统的来介绍下Lifecycle接口的设计 一、LifeCycle接口设计   为了统一管理Tomcat中的核心组件的生命周期,.

波波烤鸭的博客 1972

别再手动敲代码了!用STM32CubeMX+FreeRTOS图形化配置,5分钟搞定多任务通信框架

本文详细介绍了如何利用STM32CubeMX和FreeRTOS快速搭建多任务通信框架,大幅提升嵌入式开发效率。通过图形化配置工具,开发者可在5分钟内完成任务调度、时钟配置和内核对象生成,特别适合物联网设备开发。文章还提供了代码优化和调试技巧,帮助开发者轻松应对复杂应用场景。

weixin_30363285的博客 291

七天征服AutoSAR/SomeIP_01速成配置并代码生成

本文为AutoSAR中SomeIP配置开发的实操指南摘要,重点介绍通过通信矩阵快速构建SomeIP工程的方法。核心内容包括:1)基于Excel通信矩阵生成系统描述文件(arxml);2)在AutoSAR工具中导入文件自动生成协议栈配置,涵盖ETHIF、SoAd等模块;3)关键报错处理(COM/PDUR/SOAD/SD模块的配置修正);4)SomeIPXF的数据编解码配置;5)SWC组件与RTE任务映射。教程强调"先完成再完美"的实践原则,指导开发者快速生成基础代码框架,为后续协议调试奠定

大叔带刺的博客 303

Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】

Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】

upward 747

RH850系列芯片深度剖析 1.5-链接(ld)文件解析

基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级);

本博客专注于嵌入式软件领域技术分享。 1427

Java学习(Web服务器软件Tomcat,Servlet(概念,步骤,执行原理,生命周期,Servlet3.0注解配置))

2022/3/10 一、web相关概念回顾 1.软件结构 1)C/S:客户端/服务器端 2)B/S:浏览器/服务器算 2.资源分类 1)静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以直接被浏览器解析。 2)动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换为静态资源,再返回给浏览器。 3.网络通信三要素 1)IP:电子设备(计算机)在网络中的唯一标识。...

XXX_17的博客 264

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JavaWeb_Tomcat、Servlet、Http每日学习Day2---Servlet简介、生命周期方法、3.0注解配置、体系结构、urlpartten配置、IDEA和tomcat的相关配置

Servlet简介、生命周期方法、3.0注解配置、体系结构、urlpartten配置、IDEA和tomcat的相关配置 Servlet简介 Servlet中的生命周期方法 Servlet_3.0注解配置 IDEA和tomcat的相关配置 Servlet_体系结构与urlpartten配置 ...

weixin_42252770的博客 150

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

day13_tomcat

今日内容 web相关概念回顾 web服务器软件:Tomcat Servlet入门学习 web相关概念回顾 软件架构 C/S:客户端/服务器端 B/S:浏览器/服务器端 资源分类 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源。静态资源可以直接被浏览器解析 如:html,css,js 动态资源:每个用户访问相同的资源后,得到的结果可能不一样。称为动态资源 如:servlet/jsp,php,asp… 网络通信三要素 IP:电子设备(计算机)在网络中的唯一标识 端口

人生苦短,我用python 342

Tomcat的生命周期

上一次的文章中,阿粉在面试官面前说了对启动流程不太理解,然后和他聊了一会,然后他又提出了你既然不是特别了解启动流程的话,那你对Tomcat的生命周期熟悉么? 序言 Tomcat的生命周期管理的话,我们不能总是从书中获取那些知识,而是结合实践,然后综合书中的内容,进行一层一层的深入分析,这样对自己记忆和理解都能更加的透彻。 启动的时候的 大家可以随便找一个zip版本的Tomcat,然后直接启动起来,我们来看看是个什么样子的, 一月 11, 2021 10:16:24 上午 org.apache.coyote

懿的博客 1453

Tomcat的生命周期管理

Tomcat组件之间的静态关系虚线表示一个请求在Tomcat中的流转 若想让一个系统能对外提供服务,需创建、组装并启动这些组件;在服务停止时,还需要释放资源,这是一个动态过程。即Tomcat需动态管理这些组件的生命周期。 当我们设计一个较大系统或框架时,也需要考虑: 如何统一管理组件的创建、初始化、启动、停止和销毁? 如何做到代码逻辑清晰? 如何方便地添加或者删除组件? 如何做到组件启动和停止不遗漏、不重复? 组件有大有小,大组件管理小组件,比如Server管理Service,Service又管理连.

JavaEdge全是干货的技术号 3425

深入浅出Tomcat/3 - Tomcat生命周期

在上面的部分,其实我们已经接触到Tomcat的生命周期了,接下来我们将仔细讨论和学习Tomcat的生命周期的具体实现。 LifeCycle接口 这个LifeCycle接口上面在讲解Server和Service时其实已经有所接触。Tomcat通过org.apache.catalina.LifeCycle接口统一接管Tomcat的生命周期,所有继承自它的组件(即Component)都需要实现这个接...

weixin_34236497的博客 80

Tomcat 3.0版本的一些说明 以及 servlet 生命周期的简单介绍

1.在Eclipse 内部可以把Tomcat 版本设置成3.0 这样就可以省略掉书写web.xml 文件

Linminhui25的博客 866

Tomcat生命周期(Tomcat源码阅读系列之三)

在本文我们将会从Tomcat的生命周期管理、Tomcat的启动过程、Tomcat的关闭过程三个方面对Tomcat的生命周期进行阐述。

WoodyOilove 849

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

在上一篇文章中:Tomcat服务器顶层结构和启动过程 对Tomcat的整体架构有了一个大致的了解,这一篇主要是学习一下Tomcat的整个生命周期的管理。Tomcat的生命周期管理使用了观察者模式,使Tomcat的生命周期管理机制设计的非常优雅,在Tomcat启动时,只需要启动一个Server组件,就会启动所有的容器及对应的组件,并且触发这些容器的监听者,完成启动过程的设置。可以说是“一键式”启动的。

徐刘根的博客 7340

tomcat源码解读二 tomcat的生命周期

1    生命周期 1.1    观察者模型 tomcat生命周期采用了观察者模式,所以在介绍生命周期的时候不得不介绍观察者模式 观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新 观察者模式:     根据UML图可以看出所有被观察的对象Observer的实现类(可以有多个具体实现类)被添加到观察者Subject的实

jack_Zheng的博客 433

分享tomcat的架构和生命周期

上层容器的初始化会触发子容器的初始化,上层容器的启动会触发子容器的启动。Connector连接器中的Adapter适配器组件将封装好了的ServletRequest对象传递给Service的Engine容器,Engine处理完毕后继续将请求传递给子容器Host,Host继续处理交给子容器Context,如此下去形成了一个。在Tomcat中,容器的概念就是来装载Servlet的一个管理器,Tomcat基于分层架构的思想,设计了4种容器:Engine、Host、Context、Wrapper。

m0_74285332的博客 2188

Tomcat生命周期原理深度剖析

Tomcat作为Java Web服务器的代表,其架构中每个核心组件(如Server、Service、Engine、Host、Context、Wrapper等)都拥有独立的生命周期。Tomcat通过统一的生命周期接口(Lifecycle)管理组件的启动、停止、初始化、销毁等过程,实现了高内聚、低耦合的系统设计。Tomcat生命周期机制通过统一接口、事件驱动、分层递归等设计,实现了组件的高内聚、低耦合管理。生命周期的每一环节都可插拔扩展,便于与日志、监控、运维等系统集成。

IT技术学习与工作笔记分享 1959

深入拆解Tomcat&Jetty——Tomcat生命周期与多层容器

Tomcat的生命周期如何控制,LifeCycle接口是做什么的,多层容器之间如何控制启动顺序,Tomcat在启动时做了什么

qq_56517253的博客 1354
上一篇: 2. TOMCAT学习——TOMCAT的启动过程
下一篇: 4. TOMCAT学习——TOMCAT的载入器
程序猿 M
博客等级 码龄16年 1293粉丝 35原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值