`
韩悠悠
  • 浏览: 827026 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

11.tomcat生命周期

 
阅读更多

 Catalina由多个组件组成,当Catalina启动的时候,这些组件也会启动。当Catalina停止的时候,这些组件也必须有机会被清除。
例如,当一个容器停止工作的时候,它必须唤醒所有加载的servlet的destroy方法,而session管理器要保存session到二级存储器中。
保持组件启动和停止一致的的机制通过实现org.apache.catalina.Lifecycle接口来实现。
一个实现了Lifecycle接口的组件同是会触发一个或多个下列事件:BEFORE_START_EVENT, START_EVENT, AFTER_START_EVENT, BEFORE_STOP_EVENT, STOP_EVENT, and AFTER_STOP_EVENT。
当组件被启动的时候前三个事件会被触发,而组件停止的时候会触发后边三个事件。另外,如果一个组件可以触发事件,那么必须存在相应的监听器来对触发的事件作出回应。
监听器使用org.apache.catalina.LifecycleListener来表示。

 

 

Lifecycle接口

 

public interface Lifecycle { 
	public static final String START_EVENT = "start"; 
	public static final String BEFORE_START_EVENT = "before_start"; 
	public static final String AFTER_START_EVENT = "after_start"; 
	public static final String STOP_EVENT = "stop"; 
	public static final String BEFORE_STOP_EVENT = "before_stop"; 
	public static final String AFTER_STOP_EVENT = "after_stop"; 
	public void addLifecycleListener(LifecycleListener listener); 
	public LifecycleListener[] findLifecycleListeners();
	public void removeLifecycleListener(LifecycleListener listener); 
	public void start() throws LifecycleException;
	public void stop() throws LifecycleException; 
}

 

LifecycleEvent类
LifecycleEvent表示一个生命周期事件

 

public final class LifecycleEvent extends EventObject {
	public LifecycleEvent(Lifecycle lifecycle, String type) { 
		this(lifecycle, type, null); 
	}
	public LifecycleEvent(Lifecycle lifecycle, String type, Object data) {
		super(lifecycle); 
		this.lifecycle = lifecycle; 
		this.type = type;
		this.data = data; 
	}
	
	private Object data = null;
	 private Lifecycle lifecycle = null; 
	rivate String type = null;

	public Object getData() { return (this.data); } 
	public Lifecycle getLifecycle() { return (this.lifecycle); } 
	public String getType() { return (this.type); }
}

 

LifecycleListener接口
LifecycleListener接口可以表示生命周期监听器

 

public interface LifecycleListener { 
	public void lifecycleEvent(LifecycleEvent event);
 }

 

LifecycleSupport类
Catalina提供了一个公用类org.apache.catalina.util.LifecycleSupport来简化组件处理监听器和触发生命周期事件

public final class LifecycleSupport {


    // ----------------------------------------------------------- Constructors


    /**
     * Construct a new LifecycleSupport object associated with the specified
     * Lifecycle component.
     *
     * @param lifecycle The Lifecycle component that will be the source
     *  of events that we fire
     */
    public LifecycleSupport(Lifecycle lifecycle) {

        super();
        this.lifecycle = lifecycle;

    }


    // ----------------------------------------------------- Instance Variables


    /**
     * The source component for lifecycle events that we will fire.
     */
    private Lifecycle lifecycle = null;


    /**
     * The set of registered LifecycleListeners for event notifications.
     */
    private LifecycleListener listeners[] = new LifecycleListener[0];


    // --------------------------------------------------------- Public Methods


    /**
     * Add a lifecycle event listener to this component.
     *
     * @param listener The listener to add
     */
    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;
      }

    }


    /**
     * Get the lifecycle listeners associated with this lifecycle. If this 
     * Lifecycle has no listeners registered, a zero-length array is returned.
     */
    public LifecycleListener[] findLifecycleListeners() {

        return listeners;

    }


    /**
     * Notify all lifecycle event listeners that a particular event has
     * occurred for this Container.  The default implementation performs
     * this notification synchronously using the calling thread.
     *
     * @param type Event type
     * @param data Event data
     */
    public void fireLifecycleEvent(String type, Object data) {

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

    }


    /**
     * Remove a lifecycle event listener from this component.
     *
     * @param listener The listener to remove
     */
    public void removeLifecycleListener(LifecycleListener listener) {

        synchronized (listeners) {
            int n = -1;
            for (int i = 0; i < listeners.length; i++) {
                if (listeners[i] == listener) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;
            LifecycleListener results[] =
              new LifecycleListener[listeners.length - 1];
            int j = 0;
            for (int i = 0; i < listeners.length; i++) {
                if (i != n)
                    results[j++] = listeners[i];
            }
            listeners = results;
        }

    }


}

 

LifecycleSupport类存储所有的生命周期监听器到一个数组中,该数组为listenens,它初始化的时候没有任何成员。
private LifecycleListener listeners[] = new LifecycleListener[0];
当一个监听器通过addLifecycleListener方法被添加的时候,一个新的数组(长度比旧数组大1)会被创建。
然后就数组中的元素会被拷贝到新数组中并把新事件添加到数组中。
当一个事件被删除的时候,一个新的数组(长度为旧数组-1)的数组会被创建并将所有的元素存储到其中。

 

分享到:
评论

相关推荐

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

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

    tomcat9.0.0.M26

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

    Java 面试宝典

    11、"=="和 equals 方法究竟有什么区别? ................................................................. 12 12、静态变量和实例变量的区别? ...............................................................

    apache-tomcat-9.0.31-windows-x64.zip

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

    Tomcat源码研究.pdf

    Tomcat源码研究.pdf。Catalina脚本解析,Tomcat启动遇到的常见问题,架构探讨,JMX在tomcat中的应用,容器初探,生命周期

    apache-tomcat-8.5.50-src.zip

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

    说一说servlet的生命周期

    Servlet生命周期就是servlet从创建到销毁的过程,包括加载和实例化,初始化,服务,和销毁4步。  当客户第一次请求时,首先判断是否存在servlet对象,第一次请求时不存在,则由tomcat创建对象,调用init()方法对...

    Web第一个Servlet程序(生命周期、执行流程、tomcat)

    web项目:第一个Servlet程序 Servlet的生命周期:init--service--destroy、执行流程:构造器--init方法--循环[ service方法 ]--destory方法(正常关闭Tomcat)、启动tomcat测试

    《深入剖析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中...

    Java Servlet的注解配置与生命周期详解.docx

    执行原理加图解 1.当服务器接受到服务器请求的时候,会先解析浏览器的UPL地址,获取访问服务的路径 2.然后查找WEB.xml文件,查看是否有对应的标签体...4.tomcat会将字节码文件加载进内存,并且创建其对象 5.调用其方法

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

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

    servlet电子书籍 pdf格式

    2.3 servlet的生命周期..................................................................6 1、Servlet的生命周期分为四个阶段 ............................................6 2、在web.xml文件中配置Servlet...

    tomcat详解tomcat详解

    servlet容器与servlet之间的接口是由java servlet api定义的,在此api中定义了servlet的各种方法,这些方法在servlet生命周期的不容阶段被servlet容器调用,servlet api还定义了servlet容器传递给servlet的对象类,...

    tomcat 结构及设计.pptx

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

Global site tag (gtag.js) - Google Analytics