`
wu_quanyin
  • 浏览: 208135 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

Tomcat源码---容器生命周期管理(Lifecycle)一

阅读更多

一,tomcat中每一个容器都有其生命周期,初始化/启动/结束 等,可以在各自的生命周期内的步骤中进行一系列需要的操作如日记通知,生命周期中采用最独特的设计模式,就是适配器模式(Addapter),与命令模式(Command) 

在一个周期内涉及到的类是:(Lifecycle,LifecycleSupport(适配器),LifecycleEvent,LifecycleListener(命令))

在这里以StandardServer容器为例:

在server.xml被Digester类读取时添加了四个监听器:server.xml中

 

<!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

 StandardServer 在初始化时又作了以下操作

 

public final class StandardServer
    implements Lifecycle, Server, MBeanRegistration 

    /**
     * The lifecycle event support for this component.
     *LifecycleSupport适配器,依赖于Lifecycle
     */
    private LifecycleSupport lifecycle = new LifecycleSupport(this);

      //构造函数
       public StandardServer() {

        super();
        ServerFactory.setServer(this);

        globalNamingResources = new NamingResources();
        globalNamingResources.setContainer(this);

        if (isUseNaming()) {
            if (namingContextListener == null) {
                namingContextListener = new NamingContextListener();
                //添加进lifecyclesupport中,加这个support中总共有五个监听器
                addLifecycleListener(namingContextListener);
            }
        }
//----------------------以上步骤为监听器的添加,添加完监听器,接下去就事件触发监听

   public void start() throws LifecycleException {

        // Validate and update our current component state
        if (started) {
            log.debug(sm.getString("standardServer.start.started"));
            return;
        }

        // Notify our interested LifecycleListeners
        //事件触发为:开始启动前以下的lifecycle(LifecycleSupport上面定义的)
        lifecycle.fireLifecycleEvent(BEFORE_START_EVENT(Lifecycle中定义了一系列的事件), null);

         //正在启动
        lifecycle.fireLifecycleEvent(START_EVENT, null);
        started = true;

        // Start our defined Services
        synchronized (services) {
            for (int i = 0; i < services.length; i++) {
                if (services[i] instanceof Lifecycle)
                    ((Lifecycle) services[i]).start();
            }
        }

        // Notify our interested LifecycleListeners 
        //启动完
        lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);

    }

 

  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);

    }

 在这里贴出AprLifecycleListener的事件触发

  public void lifecycleEvent(LifecycleEvent event) {

        if (Lifecycle.INIT_EVENT.equals(event.getType())) {
           //日记打印.
            aprInitialized = init();
            if (aprInitialized) {
                try {
                    initializeSSL();
                } catch (Throwable t) {
                    if (!log.isDebugEnabled()) {
                        log.info(sm.getString("aprListener.sslInit"));
                    } else {
                        log.debug(sm.getString("aprListener.sslInit"), t);
                    }
                }
            }
        } else if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) {
            if (!aprInitialized) {
                return;
            }
            try {
                terminateAPR();
            } catch (Throwable t) {
                if (!log.isDebugEnabled()) {
                    log.info(sm.getString("aprListener.aprDestroy"));
                } else {
                    log.debug(sm.getString("aprListener.aprDestroy"), t);
                }
            }
        }

    }

 日记为:

2010-3-31 7:38:50 org.apache.catalina.core.AprLifecycleListener init

信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\P......

 

 这个命令模式跟java.awt中的addActionListener()是一样的,先添加所需的监听器根据不同的事件作出响应.

 

UML:

 

uml

-----------------------------------------------------------------------------------------------------------

tomcat中所需要的日记,错误信息以及国际化是通过StringManager管理的

他是通过组合java.util.ResourceBundle进行管理,里面最主要的特点是,tomcat是通过各个不同的包进行日记管理

 

    private StringManager(String packageName) {
        String bundleName = packageName + ".LocalStrings";
        try {
            bundle = ResourceBundle.getBundle(bundleName);
----...
 

 

  • 大小: 10 KB
7
6
分享到:
评论

相关推荐

    apache-tomcat-9.0.8-src源码资源

    5. **部署与生命周期管理**: Tomcat提供自动部署和管理Web应用的功能,这涉及到`StandardContext`和`LifeCycle`接口的实现。 6. **安全管理**: Tomcat的安全特性包括用户认证、角色授权等,这在`org.apache....

    apache-tomcat-9.0.8-src可直接导入eclipse的源码

    4. **Lifecycle**:Tomcat的组件遵循生命周期管理,包括初始化、启动、停止和销毁等阶段。 5. **Naming and Directory Interface (JNDI)**:Tomcat使用JNDI提供命名和目录服务,用于查找和绑定资源,如数据源、邮件...

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

    在描述中提到的InstanceSupport.edx文件可能是一个教学资源,可能包含了关于Tomcat生命周期和事件管理的详细讲解和实例。通常,这种类型的文件可能是教育平台如EdX上的课程资料,用于辅助学习者理解相关概念。 了解...

    tomcat源码资源包

    7. **Lifecycle and Manager Interfaces**:定义了组件的生命周期方法,如初始化、启动、停止和销毁,以及Web应用程序的管理接口。 在Eclipse中查看源码,可以帮助开发者: - **定位问题**:当遇到错误或异常时,...

    Tomcat源码 学习java很好的东东 apache-tomcat-6.0.26-src

    2. **生命周期管理**:在源码中,可以看到Tomcat如何通过生命周期接口(Lifecycle interface)和生命周期事件(LifecycleEvent)来管理各个组件的启动、停止和暂停等状态。了解这些,有助于我们掌握如何在运行时动态...

    apache-tomcat-8.5.50-src.zip

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

    tomcat-4.0.1源码

    - **生命周期管理**:Tomcat使用接口`Lifecycle`和`LifecycleListener`来管理组件的生命周期事件,如启动、停止、暂停和恢复。 - **部署与配置**:Tomcat的`server.xml`配置文件定义了服务器的全局设置,而`web.xml...

    apache-tomcat-6.0.18源码

    5. **生命周期管理**:Tomcat使用Java的生命周期接口(Lifecycle)来管理和控制其组件的状态。每个组件都有若干个状态(如 初始化、运行、暂停、停止、销毁),并且可以注册监听器来响应这些状态变化。 6. **线程...

    apache-tomcat-8.5.100-src Tomcat源码解析

    4. `Lifecycle`和`Container`接口:这两个接口定义了Tomcat组件的生命周期管理和容器结构。所有Tomcat组件都遵循这些接口定义的状态转换和嵌套容器模型。 5. `Server.xml`配置文件:这是Tomcat最重要的配置文件,...

    tomcat7源码

    Tomcat7的生命周期管理是另一个重要的概念。每个组件都有自己的启动和停止方法,这些方法在`Lifecycle`接口中定义。通过观察源码,我们可以了解到如何正确初始化和关闭Tomcat的各种组件。 此外,源码中还有许多值得...

    tomcat-8.5.40版本源码压缩包

    - Tomcat使用了Java的生命周期接口(Lifecycle interface)来管理各个组件的状态,如启动、停止、暂停和恢复。 4. **容器概念**: - **Engine**:顶级容器,管理多个Host。 - **Host**:对应于域名,管理多个...

    tomcat源码解析

    Servlet容器是Java EE平台的一个重要组成部分,它的主要职责是管理Servlet的生命周期,并处理来自客户端的HTTP请求。当一个HTTP请求到达Servlet容器时,容器会根据配置信息找到合适的Servlet来处理该请求,并将处理...

    tomcat源码

    4. **Lifecycle**:在Tomcat中,每个组件都有一个生命周期,包括初始化、启动、停止和销毁等阶段。源码中关于生命周期的管理可以帮助我们理解组件如何正确地启动和关闭。 5. **Logging**:Tomcat使用内置的日志系统...

    tomcat源码基于6.0

    4. **生命周期管理**:Tomcat通过`Lifecycle`接口和`LifeCycleListener`机制来管理Servlet的生命周期,包括装载、初始化、启动、停止和卸载等阶段。 5. **JSP编译**:Jasper会监控JSP文件的改动,自动重新编译。JSP...

    tomcat架构的源码分析

    - `setContainer`方法确保只与一个`Container`建立关联,并管理其生命周期。 - `addConnector`方法设置关联关系,并初始化和启动`Connector`。 ##### 3. Connector组件 - **定义**:`Connector`组件是Tomcat中...

    tomcat-native-1.2.36-src.tar.gz

    2. **生命周期管理**:通过`Lifecycle`接口和`LifecycleListener`接口,我们可以观察和控制Tomcat组件的生命周期,这对于自定义扩展或性能调整至关重要。 3. **请求处理流程**:从请求到达Coyote Connector,经过...

    apache-tomcat-6.0.33-src tomcat6.0.33源代码

    8. **生命周期管理**:Tomcat组件遵循一种称为"生命周期"的概念,使得它们可以在启动、运行和停止时执行特定的步骤。`Lifecycle`接口和`LifecycleListener`接口是这一概念的核心。 9. **线程模型**:Tomcat使用工作...

    MyEclipse下Tomcat_7.0.78源码,可以直接运行

    4. `Lifecycle`:管理组件的生命周期,包括初始化、启动、停止和销毁。 5. `JMX`:通过Java Management Extensions监控Tomcat的运行状态。 通过对这些核心模块的深入研究,可以了解到Tomcat如何接收和处理HTTP请求...

    02-Tomcat源码解读1

    总的来说,Tomcat源码解读需要把握住Server和Service这两个核心组件,理解它们如何通过Connector与Engine协同工作,以及生命周期管理和启动流程的设计。同时,要关注Container的层次结构以及与配置文件的交互,这将...

Global site tag (gtag.js) - Google Analytics