`
learnworld
  • 浏览: 169648 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

tomcat学习系列(1)---tomcat事件处理机制

阅读更多
    最近在阅读“how tomcat works”这本书,结合tomcat7的源码进行学习。对于学习的收获,将通过“tomcat学习系列”记录下来,和大家一起分享和交流,也算对自己学习的一种促进。闲话不多说,正文开始。
    Catalina内部由多个组件组成,启动时各个组件都需要启动,关闭时需要各个组件关闭。如何协作各个组件的初始化、启动、停止、销毁等的一致性,通过各组件实现Lifecycle这个接口来完成。各组件在启动、关闭等重要生命周期中,会发出事件通知,通知已注册的观察者做事件处理。

一、主要类图



二、主要类介绍
1) Lifecycle
Lifecycle定义了组件生命周期中的通用事件(START_EVENT、STOP_EVENT等)和接口(start、stop、destroy、addLifecycleListener、removeLifecycleListener等)。组件可以通过实现Lifecyecle接口,完成组建的重要生命周期实现和组建的观察者管理。
2)LifecycleState
定义了组件生命周期中的状态和状态对应的事件。当状态发生改变时,会发出相应事件,通知观察者进行处理。
3)LifecycleBase
Lifecycle接口的默认实现,实现init、start、stop、destroy等方法。对观察者的增加、查找和删除等操作会适配器方式,由组合的LifecycleSupport实例来完成。
4)LifecycleSupport
观察者的实际管理类,实现观察者的注册、删除、查询、调用等操作。
5)LifecycleListener
生命周期的观察者,定义了观察者的事件处理接口lifecycleEvent(LifecycleEvent event)。
6)ServerLifecycleListener
实际的观察者,实现了事件处理接口。
7)LifecycleEvent
观察者使用的参数,它封装了事件来源、事件类型和事件数据,使得观察者可以按事件来源和事件类型分类处理事件。

三、生命周期重要过程
1. 观察者注册
观察者的注册可以通过xml方式配置,也可以通过直接调用Lifecycle的观察者添加方法。server.xml中观察者配置如下:
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
...
</Server>

LifecycleSupport的观察者注册代码如下:
public final class LifecycleSupport {
    // 观察者数组
    private LifecycleListener listeners[] = new LifecycleListener[0];
    ...
    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;
      }

    }
}

观察者是通过数组来维护,每次增加一个新的观察者,都需要将当前数组长度加1,将原来数组内容拷贝到新的数组中。对这里的设计我比较困惑,为什么采用这种数组扩容方式,这样每次增加新增观察者都需要数组拷贝,影响性能。可能的一个原因是,考虑到观察者数目少和新增的次数少,这种方式可以减少内存占用。

2. 通知观察者
组件的生命周期中状态发生改变时,都会发出事件,通知观察者处理。下面以LifecycleBase中init()方法举例说明。
public abstract class LifecycleBase implements Lifecycle {
    private LifecycleSupport lifecycle = new LifecycleSupport(this);
    // 当前状态
    private volatile LifecycleState state = LifecycleState.NEW;
    public synchronized final void init() throws LifecycleException {
        if (!state.equals(LifecycleState.NEW)) {
            invalidTransition(Lifecycle.BEFORE_INIT_EVENT);
        }
        // 状态转移到INITIALIZING,会发送事件
        setState(LifecycleState.INITIALIZING);
        initInternal();
        setState(LifecycleState.INITIALIZED);
    }

    protected synchronized void setState(LifecycleState state, Object data) {
        ...
        this.state = state;
        // state为枚举类型,获取该枚举值对应的事件类型
        String lifecycleEvent = state.getLifecycleEvent();
        if (lifecycleEvent != null) {
            // 发起事件通知
            fireLifecycleEvent(lifecycleEvent, data);
        }
    }

    // 调用LifecycleSupport进行事件处理
    protected void fireLifecycleEvent(String type, Object data) {
        lifecycle.fireLifecycleEvent(type, data);
    }
}

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. 观察者事件处理
以ServerLifecycleListener为例,说明观察者事件处理过程。
public class ServerLifecycleListener
    implements ContainerListener, LifecycleListener, PropertyChangeListener {
    ...
    public void lifecycleEvent(LifecycleEvent event) {
        Lifecycle lifecycle = event.getLifecycle();
        if (Lifecycle.START_EVENT.equals(event.getType())) {
                if (lifecycle instanceof Server) {
                    ...
                }
                if( lifecycle instanceof Service ) {
                   ...
                }          
                if (lifecycle instanceof StandardContext){
                    ...
                }
           
        } else if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) {
                ...
        }
    }
}
观察者可以通过事件来源(lifecycle)和事件类型(eventType)对事件分类处理。

四、 总结
tomcat中事件处理机制比较灵活,在日常工作的设计中值得借鉴,比如下面的业务场景:对客户投诉的创建、撤销、终止等,可以采用如下处理方式:
--生命周期管理--
1. 创建统一的投诉业务生命周期Lifecycle,如create、cancel、destroy等。
2. 定义投诉业务的状态枚举类(对应tomcat中LifecycleState),枚举类中定义每个状态对应的事件类型。
--观察者注册--
3. 创建观察者管理service(对应tomcat中的LifecycleSupport)。观察者列表可以通过spring bean方式注入。
--观察者通知--
4. 在生命周期中状态改变时,比如投诉创建时,发送事件通知,调用观察者管理service,通知观察者处理。
5. 包装观察者所需要的数据(对应tomcat中的LifecycleEvent),如事件来源、类型等,供观察者使用。
--观察者处理--
6. 定义实际观察者,按事件来源和类型分别做业务处理,比如投诉创建时,将投诉发生时用户的业务开通快照记录下来。
  • 大小: 117.6 KB
分享到:
评论

相关推荐

    apache-tomcat-7.0.62-src和apache-tomcat-6.0.39-src的源码

    1. **Servlet 2.5规范**:Tomcat 6是基于Servlet 2.5规范实现的,你可以通过源码了解如何解析和处理Servlet配置、请求响应以及过滤器链的执行机制。 2. **JSP 2.1规范**:Tomcat 6也支持JSP 2.1,你可以看到JSP编译...

    Tomcat-9.0-API

    而管道(Pipelines)是Tomcat内部处理请求的机制,它们由一系列Valves(阀门)组成,每个Valve执行特定的任务。`org.apache.catalina.core.StandardPipeline`和`org.apache.catalina.Valve`接口是理解这一过程的关键...

    apache-tomcat-8.5.38-src.zip

    "apache-tomcat-8.5.38-src"中的源代码允许开发者深入了解Tomcat的工作原理,这对于学习Tomcat的内部机制、调试、优化以及自定义配置非常有用。源代码包含以下几个关键部分: - **Catalina**: 这是Tomcat的主要组件...

    apache-tomcat-7.0.57-src.zip

    Apache Tomcat 7.0.57是Tomcat 7系列的一个稳定版本,它遵循了Java EE 6规范,支持Servlet 3.0、JSP 2.2和EL 2.2标准。在这一版本中,你可以找到以下关键组件和特性: 1. **Catalina**:这是Tomcat的主要部分,实现...

    apache-tomcat-8.5.46-src.zip

    1. **Tomcat版本**: 版本号8.5.46表明这是Tomcat 8系列的一个稳定版本,其中46代表该版本的迭代次数。Tomcat 8.x系列是对Java EE 7标准的支持。 2. **源代码结构**:解压后的“apache-tomcat-8.5.46-src”目录中,...

    apache-tomcat-5.5.25-src.tar.gz

    对于学习Java Web开发和服务器端技术的人来说,分析和研究Tomcat源码是一个很好的学习途径,可以帮助理解Web服务器的内部运作机制,提升开发技能。同时,对于运维人员来说,了解源码也有助于更好地排查和解决运行时...

    Tomcat:apache-tomcat-6.0.18

    在这个"apache-tomcat-6.0.18"版本中,我们关注的是Tomcat的第六个主要版本系列,即Tomcat 6。这个版本是在Java EE 5规范下开发的,它支持Servlet 2.5和JSP 2.1标准。 Tomcat的核心功能包括: 1. **Servlet容器**:...

    tomcat\apache-tomcat-5.5.15-5323.rar

    版本号5.5.15表明这是Tomcat 5.5系列的一个特定版本,发布于2007年,虽然现在已经较为陈旧,但对于学习历史版本或兼容旧应用来说仍有价值。 描述中的信息 "tomcat\apache-tomcat-5.5.15-5323.rar" 与标题一致,...

    apache-tomcat-6.0.45-src.zip

    Tomcat 6.0.45是该系列的一个较早版本,它提供了对Servlet 2.5和JSP 2.1规范的支持。源代码的发布对于开发者来说具有重要意义,因为它允许我们深入了解Tomcat的工作原理,进行定制化开发,调试或优化性能。 1. **...

    apache-tomcat-7.0.96-windows-x86.zip

    6. **性能优化**:Tomcat 7.0.x 系列相较于之前的版本,对性能进行了优化,包括改进的线程管理、内存分配策略以及更高效的连接器实现,使得它可以处理更高的并发量。 7. **安全性增强**:Tomcat 7.0.96 包含了安全...

    apache-tomcat-8.5.78.tar.gz

    1. **Tomcat简介**: - Tomcat是按照Java Community Process的JSR 154和JSR 245规范实现的Servlet容器,它支持Servlet和JSP标准。 - Tomcat与Apache HTTP Server不同,虽然名字相似,但Apache HTTP Server是一个...

    HowTomcatWorks(1-6章)

    《HowTomcatWorks》系列教程主要讲解了Apache Tomcat服务器的工作原理和实现机制,涵盖了从基础到进阶的多个方面。以下是对每个章节内容的详细解读: **Chapter 00:Tomcat概述** 这一章首先介绍了Tomcat的历史背景...

    apache-tomcat-5.5.20

    1. **Catalina**:这是Tomcat的核心组件,实现了Servlet和JSP规范,负责处理HTTP请求并调用相应的Servlet或JSP页面。 2. **Jasper**:这是一个JSP编译器,将JSP文件转换成Servlet源代码,然后编译成.class文件供...

    Tomcat学习资料

    ### Tomcat学习资料知识点梳理 #### 一、Tomcat简介 **Tomcat** 是一个开源的轻量级Web应用服务器,适用于中小型系统和并发访问用户不是很多的场合。它由Apache Software Foundation(ASF)的Jakarta项目开发,因...

    Ansible-ansible-role-tomcat.zip

    它可能包含了一系列的Ansible任务和模板,这些任务可以自动处理下载Tomcat安装包、安装依赖、设置环境变量、配置服务器端口、创建和管理用户、启动和停止服务等操作。角色通常会遵循一定的约定,如目录结构,这使得...

    apache-tomcat-8.0.1-src.zip

    Tomcat 8.0.1是Tomcat 8系列的一个版本,该系列引入了许多新特性和改进,包括对Java EE 7的支持、改进的NIO连接器、更好的性能和稳定性等。这个版本的源代码提供给开发者深入了解Tomcat的内部实现和进行定制化开发的...

    apache-tomcat-5.5.26

    5. **安全性**:Tomcat 5.5.26支持基本的身份验证和授权机制,如` Realm `配置,允许通过用户数据库或JaAS(Java Authentication and Authorization Service)进行身份验证。 6. **性能优化**:可以通过调整`server...

    apache-tomcat-8.5.41

    - Tomcat提供了多种安全机制,如角色为基础的访问控制(RBAC)、SSL/TLS加密、 FORM和BASIC认证等。 - `conf/server.xml`中的`&lt;Realm&gt;`元素用于定义用户认证和授权。 7. **管理工具**: - `Manager App`:一个...

    tomcat_爆破.zip

    【标题】:“Tomcat_爆破.zip”是一个与Apache Tomcat服务器安全相关的压缩包,它可能包含了一系列关于针对Tomcat服务器进行爆破攻击的工具、教程或者案例分析。 【描述】:“tomcat_爆破”描述简洁,暗示了这个...

    apache-tomcat-6.0.29-src.tar

    7. **扩展性**:Tomcat允许开发者通过Valve机制添加自定义处理逻辑,实现如访问日志记录、请求路由等功能。此外,还可以通过JMX(Java Management Extensions)进行远程管理和监控。 8. **集群与负载均衡**:Tomcat...

Global site tag (gtag.js) - Google Analytics