`
alanwu
  • 浏览: 198071 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Tomcat的生命周期管理

阅读更多
    Servlet规范中定义了一个Servlet的生命周期, Tomcat使用事件方式管理Servlet的生命周期。 Tomcat定义了一个Lifecycle接口统一管理在容器内发生的所有事件。


Lifecycle接定义了两个方法start, stop来完成创建,初始化和结束的生命周期管理。

Lifecycle接口一共定义了九种事件类型。 所有容器内处理Servlet的类都继承该接口, 如StandarServer, StandarPipeline,ContainerBase以及各种Valve。

本文主要分析Tomcat中声明周期管理的设计和实现。

Author: Benewu(at)gmail.com

一,设计: Tomcat使用了组合(Composite)和观察者(Observer)模式。

设计核心是: Lifecycle, LifecycleListener, LifecycleEvent和LifecycleSupport



Lifecycle组合了LifecycleSupport,

1. 注册事件: Lifecycle中定义的addLifecycleListener实际是使用LifecycleSupport的addLifecycleListener。

2. 通知监听者: 当Lifecycle中发生动作尤其是start和stop时会调用LifecycleSupport的fireLifecycleEvent。 这个时候LifecycleSupport的fireLifecycleEvent会根据传入的事件类型,生成LifecycleEvent事件源并且遍历通知所有注册在里面的监听(LifecycleListener)的lifecycleEvent方法.

3. 监听者响应: 监听(LifecycleListener)会根据不同的事件类型做不同的操作。


二, 实现:

   以JasperListener(初始化JSP编译引擎)监听在StandarServer的注册,通知和响应为例。

1. 注册事件: Tomcat允许用户自定义监听和加入,可以在serer.xml中灵活的配置。
<Server port="8005" shutdown="SHUTDOWN">

  ... ...
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />

  ... ...

</Server>


StandardServer继承Lifecycle接口, 有注册监听的方法。
StandardServer中注册监听的代码片断:
org.apache.catalina.core.StandardServer

public final class StandardServer
    implements Lifecycle, Server, MBeanRegistration 
 {

  ... ...

    // 组合模式
    private LifecycleSupport lifecycle = new LifecycleSupport(this);

  ... ...

    // 将监听加入到模块中
    public void addLifecycleListener(LifecycleListener listener) {

        lifecycle.addLifecycleListener(listener);

    }
  ... ...

}



org.apache.catalina.util.LifecycleSupport 中addLifecycleListener方法完成注册监听的具体实现:
public final class LifecycleSupport {
  ... ...
    private LifecycleListener listeners[] = new LifecycleListener[0];

  ... ...
    public void addLifecycleListener(LifecycleListener listener) {

      synchronized (listeners) {
          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;
      }

    }
  ... ...
}


Tomcat在启动的时候会将xml中配置的内容加载进去,(见《Tomcat中xml的解析器Digester》), 完成监听注册。


2. 通知监听者。

StandardServer在自身初始化的时候通知所有监听有初始化事件发生。
   public void initialize()
        throws LifecycleException 
    {
        if (initialized) {
                log.info(sm.getString("standardServer.initialize.initialized"));
            return;
        }
        lifecycle.fireLifecycleEvent(INIT_EVENT, null);
        initialized = true;
  ... ...
}


LifecycleSupport实现具体动作, 生成事件源并通知所有监听
    public void fireLifecycleEvent(String type, Object data) {

        LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
        LifecycleListener interested[] = listeners;
        for (int i = 0; i < interested.length; i++)
            interested[i].lifecycleEvent(event);

    }


3. 监听者响应

当LifecycleListener被调用lifecycleEvent方法, 会分析事件的类型, 根据类型做不同的响应或者不响应。

org.apache.catalina.core.JasperListener被注册在StandardServer,当StandardServer通知事件的时候, 它也会被调用。
调用到底方法是: lifecycleEvent
public class JasperListener
    implements LifecycleListener {
  ... ...
    public void lifecycleEvent(LifecycleEvent event) {
        // 判断事件类型, 根据类型作出响应
        if (Lifecycle.INIT_EVENT.equals(event.getType())) {
            try {
                // Set JSP factory
                Class.forName("org.apache.jasper.compiler.JspRuntimeContext",
                              true,
                              this.getClass().getClassLoader());
            } catch (Throwable t) {
                // Should not occur, obviously
                log.warn("Couldn't initialize Jasper", t);
            }
            // Another possibility is to do directly:
            // JspFactory.setDefaultFactory(new JspFactoryImpl());
        }

    }

   ... ...
}


   至此, Tomcat的生命周期管理分析就完成了。 可以看出Tomcat的生命周期管理设计的非常灵活和简单, 用户可以自如的加入不同监听到各个环节。

   但也看出这个设计也有一些缺点, 比如每个监听都会被通知一遍,然后自己去判断事件类型。 如果容器发生的事件多而且监听也多, 会造成很多不必要的损耗。当然Tomcat的这个问题不是很大, 因为Tomcat发生的事件不多而且监听也不是很多。


参考:
1 Java Servlet概述
http://tech.ccidnet.com/art/1077/20041123/180515_1.html



2 Tomcat 6官方文档
http://tomcat.apache.org/tomcat-6.0-doc/index.html
  • 描述: Servlet的生命周期
  • 大小: 18.7 KB
  • 描述: Tomcat Lifecycle的设计
  • 大小: 51.8 KB
分享到:
评论

相关推荐

    tomcat 生命周期,和事件管理—— lifeCycle & event

    NULL 博文链接:https://yjhexy.iteye.com/blog/669427

    类似于Jira的基于JAVA语言写的项目管理软件,可以跟踪任务和bug的进度,实现对任务和bug全生命周期管理。

    使用JAVA语言写的项目管理软件,可以跟踪任务和bug的进度,实现对任务和bug全生命周期管理。 这个项目是很早之前开发的(大约在2008年前后),所以使用的技术是传统的JSP/Servlet+JDBC方式。虽然技术比较老了,但是...

    apache-tomcat-8.5.50-src.zip

    组件的生命周期管理 用Lifecycle管理启动、停止、关闭 Lifecycle接口预览 几个核心方法 Server中的init方法示例 为啥StandardServer没有init方法 LifecycleBase中的init与initInternal方法 为什么这么设计...

    tomcat9.0.0.M26

    在9.x系列的剩余生命周期内完全改变了: - 没有 可以添加以下类的公共接口以便 解决错误和/或添加新功能。没有现有的接口方法 已删除或更改,但可能已弃用。 - 没有 注意:随着Tomcat 9的成熟,以上列表将被添加到...

    eclipse+tomcat+maven

    Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期...

    《深入剖析Tomcat(中文版+英文版)》.rar

    第6章 生命周期 第7章 日志记录器 第8章 载入器 第9章 session管理 第10章 安全性 第11章 standardwrapper 第12章 standardcontext类 第13章 host和engine 第14章 服务器组件和服务组件 第15章 digester库...

    tomcat6、7、8、9, maven3.5

    Tomcat 6.x的用户应该计划在Tomcat 6.x到达生命周期之前进行升级。 Apache Tomcat 5.x 的Apache Tomcat 5.x的是可以从档案下载。 的Apache Tomcat 5.5.X支持相同的Servlet和JSP规范版本的的Apache Tomcat 5.0.x中...

    apache-tomcat-9.0.31-windows-x64.zip

    组件的生命周期方法由容器自动调用。 如何基于tomcat编写服务端动态应用? 基于tomcat编写JSP: JSP (Java Server Page) Java服务端页面生成技术 JSP的本质是一个Servlet类。 如何编写一个JSP? 1&gt;创建...

    tomcat 结构及设计.pptx

    详细的介绍了tomcat的组成结构、生命周期管理以及管道机制。

    JavaWeb程序Tomcat及Servlet配置:实例与组件包-zip压缩包

    Servlet的生命周期由Web容器(如Tomcat)管理,包括加载、初始化、服务、销毁等阶段。 二、组件包 Java EE SDK: Java EE SDK提供了JavaWeb应用程序开发所需的所有API和库。 Tomcat: Tomcat二进制包,包含了Tomcat...

    浅谈Tomcat Session管理分析

    在上文Nginx+Tomcat关于Session的管理中简单介绍了如何使用redis来集中管理session,本文首先将介绍默认的管理器是如何管理Session的生命周期的,然后在此基础上对Redis集中式管理Session进行分析。 Tomcat Manager...

    HowTomcatWorks:《深度剖析Tomcat》原始码及笔记

    第六章生命周期 第七章日志记录器 第八章加载器 第九章会议管理 第十章应用程序 第十一章StandardWrapper 第十二章StandardContext 第十三章主机和引擎 第十四章服务器组件和服务组件 第十五章消化器库 第十六章关闭...

    how-tomcat-works中文版

    讲述Tomcat的工作原理 第1章 一个简单的Web服务器 ...第6章 生命周期(Lifecycle) 第7章 Logger 第8章 Loader 第9章 session管理 第10章 安全性 第11章 StandardWrapper 第12章 StandardContext类 ...

    apache-tomcat-11.0.0-M3-windows-x64

    omcat是一个轻量级应用服务器,是支持运行Servlet/JSP应用程序的容器,运行在jvm上,绑定IP地址并监听...1)管理servlet应用的生命周期 (2)把客户端请求的url映射到对应的servlet (3)与Servlet程序合作处理HTTP请求

    how-tomcat-works

    第6章 生命周期(Lifecycle) 43 6.1 概述 43 6.2 Lifecycle接口 43 6.3 LifecycleEvent类 44 6.4 LifecycleListener接口 44 6.5 LifecycleSupport类 44 6.6 应用程序 45 6.6.1 ex06.pyrmont.core.SimpleContext 45 ...

    管理远程win系统上的tomcat服务.zip

    项目管理系统(PM):对项目全生命周期进行规划、跟踪、控制,确保项目按时、按质、按预算完成。 三、价值与优势 提高效率:自动化工作流程、标准化业务操作,显著减少人工干预,提升工作效率。 优化决策:实时...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    第6章 生命周期(Lifecycle) 43 6.1 概述 43 6.2 Lifecycle接口 43 6.3 LifecycleEvent类 44 6.4 LifecycleListener接口 44 6.5 LifecycleSupport类 44 6.6 应用程序 45 6.6.1 ex06.pyrmont.core.SimpleContext 45 ...

    java项目之人人乐超市采购管理系统源码(ssm+mysql+jsp).zip

    并且采用了系统生命周期的结构化程序设计方法,从而将整个系统开发各阶段(系统分析、系统设计、系统实施)的基本活动贯穿起来。 所需开发环境: 开发语言:Java JDK版本:JDK1.8 服务器:tomcat7+ 数据库:mysql ...

    java毕业设计之人人乐超市采购管理系统源码(前后端完整源代码).zip

    并且采用了系统生命周期的结构化程序设计方法,从而将整个系统开发各阶段(系统分析、系统设计、系统实施)的基本活动贯穿起来。 所需开发环境: 开发语言:Java JDK版本:JDK1.8 服务器:tomcat7+ 数据库:mysql ...

Global site tag (gtag.js) - Google Analytics