Tomcat中的观察者模式 (Lifecycle)

几个重要的类,接口

LifeCycle : 主题接口

LifeCycleBase : 抽象的主题实现

LifeCycleListener : 观察者

具体分析


public interface Lifecycle {   //主题接口

    // ----------------------------------------------------- Manifest Constants

    /**
     * The LifecycleEvent type for the "component before init" event.

     */
    public static final String BEFORE_INIT_EVENT = "before_init";   //定义了tomcat启动时的状态

    /**
     * The LifecycleEvent type for the "component after init" event.

     */
    public static final String AFTER_INIT_EVENT = "after_init";

    /**
     * The LifecycleEvent type for the "component start" event.

     */
    public static final String START_EVENT = "start";

    /**
     * The LifecycleEvent type for the "component before start" event.

     */
    public static final String BEFORE_START_EVENT = "before_start";

    /**
     * The LifecycleEvent type for the "component after start" event.

     */
    public static final String AFTER_START_EVENT = "after_start";

    /**
     * The LifecycleEvent type for the "component stop" event.

     */
    public static final String STOP_EVENT = "stop";

    /**
     * The LifecycleEvent type for the "component before stop" event.

     */
    public static final String BEFORE_STOP_EVENT = "before_stop";

    /**
     * The LifecycleEvent type for the "component after stop" event.

     */
    public static final String AFTER_STOP_EVENT = "after_stop";

    /**
     * The LifecycleEvent type for the "component after destroy" event.

     */
    public static final String AFTER_DESTROY_EVENT = "after_destroy";

    /**
     * The LifecycleEvent type for the "component before destroy" event.

     */
    public static final String BEFORE_DESTROY_EVENT = "before_destroy";

    /**
     * The LifecycleEvent type for the "periodic" event.

     */
    public static final String PERIODIC_EVENT = "periodic";

    /**
     * The LifecycleEvent type for the "configure_start" event. Used by those
     * components that use a separate component to perform configuration and
     * need to signal when configuration should be performed - usually after
     * {@link #BEFORE_START_EVENT} and before {@link #START_EVENT}.

     */
    public static final String CONFIGURE_START_EVENT = "configure_start";

    /**
     * The LifecycleEvent type for the "configure_stop" event. Used by those
     * components that use a separate component to perform configuration and
     * need to signal when de-configuration should be performed - usually after
     * {@link #STOP_EVENT} and before {@link #AFTER_STOP_EVENT}.

     */
    public static final String CONFIGURE_STOP_EVENT = "configure_stop";

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

    /**
     * Add a LifecycleEvent listener to this component.

     *
     * @param listener The listener to add
     */
    public void addLifecycleListener(LifecycleListener listener);     //注册观察者的方法

    /**
     * Get the life cycle listeners associated with this life cycle.

     *
     * @return An array containing the life cycle listeners associated with this
     *         life cycle. If this component has no listeners registered, a
     *         zero-length array is returned.

     */
    public LifecycleListener[] findLifecycleListeners();              //获得所有的观察者的方法

    /**
     * Remove a LifecycleEvent listener from this component.

     *
     * @param listener The listener to remove
     */
    public void removeLifecycleListener(LifecycleListener listener);    //移除观察者的方法

    /**
     * Prepare the component for starting. This method should perform any
     * initialization required post object creation. The following
     * {@link LifecycleEvent}s will be fired in the following order:
     * <ol>
     *   <li>INIT_EVENT: On the successful completion of component
     *                   initialization.</li>
     * </ol>
     *
     * @exception LifecycleException if this component detects a fatal error
     *  that prevents this component from being used
     */
    public void init() throws LifecycleException;             //&#x521D;&#x59CB;&#x5316;&#x5BB9;&#x5668;&#x7684;&#x65B9;&#x6CD5;

    /**
     * Prepare for the beginning of active use of the public methods other than
     * property getters/setters and life cycle methods of this component. This
     * method should be called before any of the public methods other than
     * property getters/setters and life cycle methods of this component are
     * utilized. The following {@link LifecycleEvent}s will be fired in the
     * following order:
     * <ol>
     *   <li>BEFORE_START_EVENT: At the beginning of the method. It is as this
     *                           point the state transitions to
     *                           {@link LifecycleState#STARTING_PREP}.</li>
     *   <li>START_EVENT: During the method once it is safe to call start() for
     *                    any child components. It is at this point that the
     *                    state transitions to {@link LifecycleState#STARTING}
     *                    and that the public methods other than property
     *                    getters/setters and life cycle methods may be
     *                    used.</li>
     *   <li>AFTER_START_EVENT: At the end of the method, immediately before it
     *                          returns. It is at this point that the state
     *                          transitions to {@link LifecycleState#STARTED}.

     *                          </li>
     * </ol>
     *
     * @exception LifecycleException if this component detects a fatal error
     *  that prevents this component from being used
     */
    public void start() throws LifecycleException;     //&#x542F;&#x52A8;&#x5BB9;&#x5668;&#x7684;&#x65B9;&#x6CD5;

    /**
     * Gracefully terminate the active use of the public methods other than
     * property getters/setters and life cycle methods of this component. Once
     * the STOP_EVENT is fired, the public methods other than property
     * getters/setters and life cycle methods should not be used. The following
     * {@link LifecycleEvent}s will be fired in the following order:
     * <ol>
     *   <li>BEFORE_STOP_EVENT: At the beginning of the method. It is at this
     *                          point that the state transitions to
     *                          {@link LifecycleState#STOPPING_PREP}.</li>
     *   <li>STOP_EVENT: During the method once it is safe to call stop() for
     *                   any child components. It is at this point that the
     *                   state transitions to {@link LifecycleState#STOPPING}
     *                   and that the public methods other than property
     *                   getters/setters and life cycle methods may no longer be
     *                   used.</li>
     *   <li>AFTER_STOP_EVENT: At the end of the method, immediately before it
     *                         returns. It is at this point that the state
     *                         transitions to {@link LifecycleState#STOPPED}.

     *                         </li>
     * </ol>
     *
     * Note that if transitioning from {@link LifecycleState#FAILED} then the
     * three events above will be fired but the component will transition
     * directly from {@link LifecycleState#FAILED} to
     * {@link LifecycleState#STOPPING}, bypassing
     * {@link LifecycleState#STOPPING_PREP}
     *
     * @exception LifecycleException if this component detects a fatal error
     *  that needs to be reported
     */
    public void stop() throws LifecycleException;    //&#x5173;&#x95ED;&#x5BB9;&#x5668;&#x7684;&#x65B9;&#x6CD5;

    /**
     * Prepare to discard the object. The following {@link LifecycleEvent}s will
     * be fired in the following order:
     * <ol>
     *   <li>DESTROY_EVENT: On the successful completion of component
     *                      destruction.</li>
     * </ol>
     *
     * @exception LifecycleException if this component detects a fatal error
     *  that prevents this component from being used
     */
    public void destroy() throws LifecycleException;

    /**
     * Obtain the current state of the source component.

     *
     * @return The current state of the source component.

     */
    public LifecycleState getState();     //&#x83B7;&#x53D6;&#x5BB9;&#x5668;&#x5F53;&#x524D;&#x6240;&#x5904;&#x7684;&#x72B6;&#x6001;

    /**
     * Obtain a textual representation of the current component state. Useful
     * for JMX. The format of this string may vary between point releases and
     * should not be relied upon to determine component state. To determine
     * component state, use {@link #getState()}.

     *
     * @return The name of the current component state.

     */
    public String getStateName();

    /**
     * Marker interface used to indicate that the instance should only be used
     * once. Calling {@link #stop()} on an instance that supports this interface
     * will automatically call {@link #destroy()} after {@link #stop()}
     * completes.

     */
    public interface SingleUse {
    }
}


public abstract class LifecycleBase implements Lifecycle {   //&#x4E3B;&#x9898;&#x7684;&#x62BD;&#x8C61;&#x5B9E;&#x73B0;

    private static final Log log = LogFactory.getLog(LifecycleBase.class);

    private static final StringManager sm = StringManager.getManager(LifecycleBase.class);

    /**
     * The list of registered LifecycleListeners for event notifications.

     */
    private final List<lifecyclelistener> lifecycleListeners = new CopyOnWriteArrayList<>();   //&#x7528;&#x6765;&#x5B58;&#x50A8;&#x6240;&#x6709;&#x6CE8;&#x518C;&#x7684;&#x89C2;&#x5BDF;&#x8005;

    /**
     * The current state of the source component.

     */
    private volatile LifecycleState state = LifecycleState.NEW;

    /**
     * {@inheritDoc}
     */
    @Override
    public void addLifecycleListener(LifecycleListener listener) {    //&#x6CE8;&#x518C;&#x89C2;&#x5BDF;&#x8005;&#xFF0C;&#x5C06;&#x89C2;&#x5BDF;&#x8005;&#x6DFB;&#x52A0;&#x5230;&#x6570;&#x7EC4;&#x4E2D;
        lifecycleListeners.add(listener);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public LifecycleListener[] findLifecycleListeners() {         //&#x8FD4;&#x56DE;&#x89C2;&#x5BDF;&#x8005;&#x6570;&#x7EC4;
        return lifecycleListeners.toArray(new LifecycleListener[0]);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void removeLifecycleListener(LifecycleListener listener) { //&#x79FB;&#x9664;&#x89C2;&#x5BDF;&#x8005;&#x7684;&#x5B9E;&#x73B0;
        lifecycleListeners.remove(listener);
    }

    /**
     * Allow sub classes to fire {@link Lifecycle} events.

     *
     * @param type  Event type
     * @param data  Data associated with event.

     */
    protected void fireLifecycleEvent(String type, Object data) {   //&#x53D1;&#x5E03;&#x901A;&#x77E5;&#x7684;&#x65B9;&#x6CD5;
        LifecycleEvent event = new LifecycleEvent(this, type, data);  //&#x5C06;&#x4FE1;&#x606F;&#x5C01;&#x88C5;&#x6210;&#x4E00;&#x4E2A;LifecycleEvent&#x7C7B;&#x578B;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;LifecycleEvent&#x5BF9;&#x8C61;&#x7528;&#x6765;&#x7EDF;&#x4E00;&#x5C01;&#x88C5;&#x6240;&#x6709;&#x7684;&#x4FE1;&#x606F;&#x3002;
        for (LifecycleListener listener : lifecycleListeners) {      //&#x904D;&#x5386;&#x6240;&#x6709;&#x7684;&#x89C2;&#x5BDF;&#x8005;&#xFF0C;&#x5E76;&#x53D1;&#x5E03;&#x901A;&#x77E5;
            listener.lifecycleEvent(event);
        }
    }

}
</lifecyclelistener>
public interface LifecycleListener {  //&#x89C2;&#x5BDF;&#x8005;&#x63A5;&#x53E3;

    /**
     * Acknowledge the occurrence of the specified event.

     *
     * @param event LifecycleEvent that has occurred
     */
    public void lifecycleEvent(LifecycleEvent event);  //&#x63A5;&#x53D7;&#x901A;&#x77E5;&#x7684;&#x65B9;&#x6CD5;

}

可见 tomcat中通过观察者模式来对容器的生命周期进行控制

Original: https://www.cnblogs.com/liwangcai/p/11652759.html
Author: 神奇海螺。
Title: Tomcat中的观察者模式 (Lifecycle)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574178/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球