`
michael.softtech
  • 浏览: 208435 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

tomcat源码分析之Observer模式以及应用加载--Lifecycle

阅读更多

      研究过tomcat源码的朋友们可能都发现了,tomcat中几个主要的component都实现了Lifecycle接口,并且在

start的时候通常都会publish一些事件。在这个过程中tomcat是通过Observer模式来实现相关功能的。下面以StandardHost为例来说明。

 

      StandardHost是StandardContext(也就是部署在tomcat下面的一个个应用)的上级Container.Host是在Digester server.xml文件的时候生成的。但是,在digester的时候,并没有standardcontext的相关配置。那么,StandardContext是如何加载的呢?

 

     下面就来研究一下standardhost的源码:

      先来看init源码:

     

 public void init() {
        if( initialized ) return;
        initialized=true;
        
        // already registered.
        if( getParent() == null ) {
            try {
                // Register with the Engine
                ObjectName serviceName=new ObjectName(domain + 
                                        ":type=Engine");

                HostConfig deployer = new HostConfig();
                addLifecycleListener(deployer);                
                if( mserver.isRegistered( serviceName )) {
                    if(log.isDebugEnabled())
                        log.debug("Registering "+ serviceName +" with the Engine");
                    mserver.invoke( serviceName, "addChild",
                            new Object[] { this },
                            new String[] { "org.apache.catalina.Container" } );
                }
            } catch( Exception ex ) {
                log.error("Host registering failed!",ex);
            }
        }
        
        if( oname==null ) {
            // not registered in JMX yet - standalone mode
            try {
                StandardEngine engine=(StandardEngine)parent;
                domain=engine.getName();
                if(log.isDebugEnabled())
                    log.debug( "Register host " + getName() + " with domain "+ domain );
                oname=new ObjectName(domain + ":type=Host,host=" +
                        this.getName());
                controller = oname;
                Registry.getRegistry(null, null)
                    .registerComponent(this, oname, null);
            } catch( Throwable t ) {
                log.error("Host registering failed!", t );
            }
        }
    }

 

     

    StandardHost本身是一个container(ContainerBase),从以上代码可以看出,它在初始化的时候注册了一个LifecycleListener:HostConfig. 不同于一般的Observer模式的地方是,standard并不直接拥有listeners,而是通过拥有一个工具类-LifecycleSupport来维护与listeners的关系。这样就使得代码看起来很干净。已经注册了Observer,那么在哪里触发事件呢?事件触发是在container启动的时候(其实观察tomcat6中的重要组件,比如standardserver,standardservice以及container如standardengine,standardhost,standardcontext,他们在start的时候都会发布这么几个事件:beforestartevent,startevent,afterstartevent). 于是在standardhost start的时候,触发事件,listeners作出响应,hostconfig的响应代码如下:

 

   

public void lifecycleEvent(LifecycleEvent event) {

        if (event.getType().equals(Lifecycle.PERIODIC_EVENT))
            check();

        // Identify the host we are associated with
        try {
            host = (Host) event.getLifecycle();
            if (host instanceof StandardHost) {
                setDeployXML(((StandardHost) host).isDeployXML());
                setUnpackWARs(((StandardHost) host).isUnpackWARs());
                setXmlNamespaceAware(((StandardHost) host).getXmlNamespaceAware());
                setXmlValidation(((StandardHost) host).getXmlValidation());
            }
        } catch (ClassCastException e) {
            log.error(sm.getString("hostConfig.cce", event.getLifecycle()), e);
            return;
        }

        // Process the event that has occurred
        if (event.getType().equals(Lifecycle.START_EVENT))
            start();
        else if (event.getType().equals(Lifecycle.STOP_EVENT))
            stop();

    }

 

    可以看出,如果触发的事件是START_EVENT,那么hostconfig调用自己的start方法。而正是在

    start方法里面,调用deployApps来生成standardContext.

     至此,不仅了解了tomcat中Lifecycle的Observer模式,而且了解了tomcat加载应用的流程。可谓一举两得。

     

分享到:
评论

相关推荐

    Observer 观察者模式 示例 源码 ----设计模式

    观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...

    Observer模式的应用

    请选用适当的设计模式,编写一个股票行情分析软件,随着时间的推移和股票价格的变动,实现各种指标的动态更新(要求至少实现一个股票的分时图和K线图:为降低编程工作量,K线图可以用开盘价、收盘价、最高价、最低价...

    Observer模式

    源码分析方面,我们可以深入研究java.util.Observable和java.util.Observer的实现,了解如何通过这两个类实现观察者模式。同时,还可以探索其他编程语言中对观察者模式的支持,如C#的System.ComponentModel....

    重温Observer模式--热水器·改

    在C#中,虽然委托和事件提供了便利的实现方式,但通过GOF的经典方式也能实现同样的功能,这有助于理解模式的本质,并在不支持委托和事件的语言中应用Observer模式。在设计时,选择使用哪种实现方式取决于具体的需求...

    Tomcat系统架构与设计模式[整理].pdf

    本文将从 Tomcat 的工作原理、设计模式两个方面来分析 Tomcat 的系统架构。 一、Tomcat 的工作原理 Tomcat 的工作原理可以分为两个部分: Connector 组件和 Container 组件。 Connector 组件负责对外交流,主要...

    A Linear Extended State Observer-based Fuzzy Fault-tolerant Controller for Autonomous Underwater Vehicle

    A Linear Extended State Observer-based Fuzzy Fault-tolerant Controller for Autonomous Underwater Vehicle

    Observer设计模式实例

    这种模式在多线程、事件驱动、实时系统以及用户界面编程等领域有着广泛的应用。 在Observer模式中,主要有两个关键角色:Subject(主题)和Observer(观察者)。Subject维护了一个Observer的列表,并负责在状态变化...

    设计模式的应用--论文素材2

    设计模式是一种在软件设计中被广泛应用的通用解决方案模板,它总结了在特定上下文中解决常见问题的最佳实践。设计模式的概念起源于建筑行业,后来被引入到计算机科学,特别是在面向对象编程领域,成为提升代码可复用...

    设计模式的应用--论文素材设计模式的应用--论文素材

    此外,文中还提到了其他设计模式在报表系统中的应用,如观察者(Observer)模式,用于实现模型和视图之间的实时同步,当模型数据发生变化时,观察者(视图)会收到通知并作出响应。适配器模式(Adapter)则帮助不同...

    State-observer-for-nonlinear-systems.rar_观测器_观测器非线性_非线性 观测器_非线性观

    在这个压缩包文件"State-observer-for-nonlinear-systems.rar"中,我们关注的是非线性系统的观测器设计,特别是针对具有不确定性因素的非线性系统。 标题"State-observer-for-nonlinear-systems.rar_观测器_观测器...

    Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析1

    3. Observer 模式:Observer 模式在 Tomcat 中主要应用于事件监听机制,例如 LifecycleEvent 事件,在 Server.xml 文件中,我们可以看到许多 Observer 的实现,例如 LifecycleListener、LifecycleEvent 等,这些 ...

    resize-observer-polyfill:用于Resize Observer API的polyfill

    安装从NPM: npm install resize-observer-polyfill --save-dev 从凉亭: (将在下一个主要版本中删除) bower install resize-observer-polyfill --save-dev浏览器支持Polyfill已在以下浏览器中经过测试: 注意

    设计模式之Observer

    《设计模式之Observer》 设计模式是软件工程中的一种最佳实践,它们是在特定场景下解决常见问题的经验总结。Observer模式,又称为“观察者模式”...同时,结合源码分析,可以加深对设计模式本质的理解,提升编程技能。

    Observer与Command模式在VTK类库设计中的应用研究

    ### Observer与Command模式在VTK类库设计中的应用研究 #### 一、引言 VTK(Visualization Toolkit)是一套开源的三维可视化开发库,在国外得到了广泛应用,而在国内的研究相对较少,导致其应用受到一定限制。为了...

    设计模式之Observer - 观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...

    resize-observer-polyfill源码分析

    ### resize-observer-polyfill源码分析 #### 1. ResizeObserver 类实现 `ResizeObserver` 类是 `resize-observer-polyfill` 的核心部分之一,它的主要职责是提供一个接口,让开发者能够通过该接口注册一个回调函数...

    vue-resize-observer:Vue调整大小观察器

    Vue调整大小观察器 English |安装Vue3.0 npm install --save vue-resize-observer@next Vue2.0 npm install --save vue-resize-observer 模块导入和示例导入软件包并将其安装到Vue中: const VueResizeObserver = ...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    C++源代码文件可以帮助你更好地理解如何在实际项目中应用这些模式,通过阅读和分析代码,你可以学习如何在C++中实现这些设计模式,并将它们融入到自己的编程实践中。 总而言之,设计模式是软件开发中的宝贵财富,...

    OBserver模式设计实现

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java和C++等面向对象编程语言中,这种模式广泛用于事件处理和实时系统,...

Global site tag (gtag.js) - Google Analytics