`
alanwu
  • 浏览: 200462 次
  • 性别: 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

    本文将深入探讨Tomcat的生命周期管理和事件管理,这两个概念是理解和优化Tomcat应用程序性能的关键。 首先,让我们关注Tomcat的生命周期。每个在Tomcat中部署的应用程序都有一个特定的生命周期,它由一系列的阶段...

    tomcat 架构 分析

    Tomcat的架构设计中使用了多个设计模式,例如上述生命周期管理的实现运用了状态模式,事件监听机制则运用了观察者模式。这些设计模式的使用大大增强了Tomcat的扩展性、灵活性和可维护性。 总结来说,Tomcat的架构...

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

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

    解读servlet生命周期

    Servlet生命周期是Java Web开发中一个关键的概念,它描述了Servlet从创建到销毁的整个过程,这个过程由Servlet容器(如Tomcat)进行管理。Servlet生命周期主要分为三个阶段:初始化阶段、运行阶段和销毁阶段。 1. ...

    tomcat6的源码

    3. **生命周期管理**:每个Tomcat组件都有自己的生命周期,包括初始化、启动、停止和销毁。源码中,这些生命周期方法的实现有助于理解Tomcat的内部工作流程。 4. **部署与加载**:Tomcat可以自动或手动部署Web应用...

    servlet生命周期详解

    Servlet生命周期是Java Web开发中的核心概念,它涵盖了Servlet从创建到销毁的整个过程,主要分为初始化...理解并掌握Servlet的生命周期对于优化性能和管理资源至关重要,尤其是在处理高并发和长时间运行的Web应用中。

    Tomcat深入剖析pdf+源码(Tomcat运行原理)

    3. **Servlet生命周期**:Servlet在Tomcat中的生命周期包括加载、初始化、服务、销毁四个阶段。Tomcat通过Servlet容器管理Servlet实例,确保其正确地创建、初始化和销毁。 4. **请求处理**:当一个HTTP请求到达时,...

    How Tomcat Works 中文版+例程源码

    3. **生命周期管理**:Tomcat按照一定的生命周期管理Servlet,包括加载、初始化、服务、销毁等阶段。每个Servlet实例都有自己的生命周期,Tomcat会根据需要创建和销毁它们。 4. **连接器(Connector)**:Tomcat...

    Tomcat 接口文档 API

    6. **Lifecycle Interfaces**: Tomcat API包含一系列生命周期接口,如Lifecycle、LifecycleListener、LifecycleState等,用于管理组件的创建、启动、停止和销毁过程。开发者可以通过实现这些接口,监控和干预Tomcat...

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理1

    Tomcat 系统架构与设计模式,第 1 部分:工作原理 本文将从 Tomcat 系统架构与设计模式的角度,...在下一部分中,我们将继续探讨 Tomcat 的工作原理,包括请求处理、Servlet 生命周期管理和生命周期事件处理等方面。

    Tomcat系统架构分析

    StandardService类除了实现Service接口外,还实现了Lifecycle接口,这使得StandardService可以对下属组件进行生命周期管理,包括启动、停止、重启等。Lifecycle接口的引入是Tomcat设计中的一个重要决策,它提供了一...

    apache-tomcat-10.0.14.tar.gz

    生命周期管理: Servlet容器负责管理Servlet的生命周期,包括初始化、服务处理和销毁。 当Servlet容器启动时,它会加载并初始化配置中指定的Servlet类。在Servlet的生命周期中,容器负责调用相应的生命周期方法,...

    Servlet生命周期

    ### Servlet 生命周期详解 #### 一、概述 ...了解 Servlet 的生命周期对于更好地控制和优化 Web 应用程序至关重要...通过深入了解 Servlet 的生命周期,开发者可以更有效地管理和优化 Web 应用程序,提高其性能和稳定性。

    servlet执行过程与生命周期

    ### Servlet执行过程与生命周期详解 在探讨Servlet的执行...理解Servlet的执行过程与生命周期对Java Web开发至关重要,它不仅帮助开发者设计出更高效、更健壮的Web应用,还为解决常见的Web开发问题提供了理论基础。

    说一说servlet的生命周期

    在实际开发中,理解Servlet的生命周期对于优化性能和管理资源至关重要。例如,可以通过控制Servlet的实例化次数来减少内存消耗,或者在`init()`方法中初始化一次性的资源,在`destroy()`方法中及时释放,以确保...

    probe tomcat主机管理工具

    Servlet容器负责创建Servlet的实例,管理其生命周期,并处理来自客户端的请求。 3. **.war文件**:WAR(Web Application Archive)文件是Java Web应用程序的标准打包格式,包含了所有必要的资源,如HTML、CSS、...

    tomcat源码+文档pdf+源码解析

    1. **Catalina**:这是Tomcat的核心组件,负责Servlet容器的主要功能,如容器管理、生命周期管理和请求处理。Catalina包含Context、Host和Engine等层次结构,它们分别对应于Web应用、虚拟主机和整个服务器。 2. **...

    apache-tomcat-7.0.39

    4. **生命周期管理**:Tomcat管理Web应用程序的生命周期,包括加载、初始化、服务、停止和卸载等阶段。 5. **安全性**:Tomcat支持各种安全机制,如SSL/TLS加密、基本认证、digest认证和Form认证等。 6. **配置...

Global site tag (gtag.js) - Google Analytics