zoukankan      html  css  js  c++  java
  • Tomcat源码分析 | 一文详解生命周期机制Lifecycle

    目录

    • 什么是Lifecycle?
    • Lifecycle方法
    • LifecycleBase
      • 增加、删除和获取监听器
      • init()
      • start()
      • stop()
      • destroy()
      • 模板方法
    • 总结

    前言

    Tomcat里面有各种各样的组件,每个组件各司其职,组件之间又相互协作共同完成web服务器这样的工程。在这些组件之上,Lifecycle(生命周期机制)至关重要!在学习各个组件之前,我们需要看看Lifecycle是什么以及能做什么?实现原理又是怎样的?

    什么是Lifecycle?

    Lifecycle,其实就是一个状态机,对组件的由生到死状态的管理。

    当组件在STARTING_PREP、STARTING或STARTED时,调用start()方法没有任何效果

    当组件在NEW状态时,调用start()方法会导致init()方法被立刻执行,随后start()方法被执行

    当组件在STOPPING_PREP、STOPPING或STOPPED时,调用stop()方法没有任何效果

    当一个组件在NEW状态时,调用stop()方法会将组件状态变更为STOPPED,比较典型的场景就是组件启动失败,其子组件还没有启动。当一个组件停止的时候,它将尝试停止它下面的所有子组件,即使子组件还没有启动。

    Lifecycle方法

    我们看看Lifecycle有哪些方法,如下所示:

    public interface Lifecycle {
        // 添加监听器
        public void addLifecycleListener(LifecycleListener listener);
        // 获取所以监听器
        public LifecycleListener[] findLifecycleListeners();
        // 移除某个监听器
        public void removeLifecycleListener(LifecycleListener listener);
        // 初始化方法
        public void init() throws LifecycleException;
        // 启动方法
        public void start() throws LifecycleException;
        // 停止方法,和start对应
        public void stop() throws LifecycleException;
        // 销毁方法,和init对应
        public void destroy() throws LifecycleException;
        // 获取生命周期状态
        public LifecycleState getState();
        // 获取字符串类型的生命周期状态
        public String getStateName();
    }

    LifecycleBase

    LifecycleBase是Lifecycle的基本实现。我们逐一来看Lifecycle的各个方法。

    增加、删除和获取监听器

    private final List<LifecycleListener> lifecycleListeners = new CopyOnWriteArrayList<>();

    @Override
    public void addLifecycleListener(LifecycleListener listener) {
        lifecycleListeners.add(listener);
    }
    @Override
    public LifecycleListener[] findLifecycleListeners() {
        return lifecycleListeners.toArray(new LifecycleListener[0]);
    }
    @Override
    public void removeLifecycleListener(LifecycleListener listener) {
        lifecycleListeners.remove(listener);
    }
    1. 生命周期监听器保存在一个线程安全的List中,CopyOnWriteArrayList。所以add和remove都是直接调用此List的相应方法。
    2. findLifecycleListeners返回的是一个数组,为了线程安全,所以这儿会生成一个新数组。

    init()方法

    @Override
    public final synchronized void init() throws LifecycleException {
        // 非NEW状态,不允许调用init()方法
        if (!state.equals(LifecycleState.NEW)) {
            invalidTransition(Lifecycle.BEFORE_INIT_EVENT);
        }

        try {
            // 初始化逻辑之前,先将状态变更为`INITIALIZING`
            setStateInternal(LifecycleState.INITIALIZING, null, false);
            // 初始化,该方法为一个abstract方法,需要组件自行实现
            initInternal();
            // 初始化完成之后,状态变更为`INITIALIZED`
            setStateInternal(LifecycleState.INITIALIZED, null, false);
        } catch (Throwable t) {
            // 初始化的过程中,可能会有异常抛出,这时需要捕获异常,并将状态变更为`FAILED`
            ExceptionUtils.handleThrowable(t);
            setStateInternal(LifecycleState.FAILED, null, false);
            throw new LifecycleException(
                    sm.getString("lifecycleBase.initFail",toString()), t);
        }
    }

    setStateInternal方法用于维护状态,同时在状态转换成功之后触发事件。为了状态的可见性,所以state声明为volatile类型的。

    private volatile LifecycleState state = LifecycleState.NEW;。
    private synchronized void setStateInternal(LifecycleState state,
            Object data, boolean check) throws LifecycleException {
        if (log.isDebugEnabled()) {
            log.debug(sm.getString("lifecycleBase.setState", this, state));
        }

        // 是否校验状态
        if (check) {
            // Must have been triggered by one of the abstract methods (assume
            // code in this class is correct)
            // null is never a valid state
            // state不允许为null
            if (state == null) {
                invalidTransition("null");
                // Unreachable code - here to stop eclipse complaining about
                // a possible NPE further down the method
                return;
            }

            // Any method can transition to failed
            // startInternal() permits STARTING_PREP to STARTING
            // stopInternal() permits STOPPING_PREP to STOPPING and FAILED to
            // STOPPING
            if (!(state == LifecycleState.FAILED ||
                    (this.state == LifecycleState.STARTING_PREP &&
                            state == LifecycleState.STARTING) ||
                    (this.state == LifecycleState.STOPPING_PREP &&
                            state == LifecycleState.STOPPING) ||
                    (this.state == LifecycleState.FAILED &&
                            state == LifecycleState.STOPPING))) {
                // No other transition permitted
                invalidTransition(state.name());
            }
        }

        // 设置状态
        this.state = state;
        // 触发事件
        String lifecycleEvent = state.getLifecycleEvent();
        if (lifecycleEvent != null) {
            fireLifecycleEvent(lifecycleEvent, data);
        }
    }

    我们看看fireLifecycleEvent方法,

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

    首先, 创建一个事件对象, 然通知所有的监听器发生了该事件.并做响应.

    start()方法

    @Override
    public final synchronized void start() throws LifecycleException {
       // `STARTING_PREP`、`STARTING`和`STARTED时,将忽略start()逻辑
       if (LifecycleState.STARTING_PREP.equals(state) || LifecycleState.STARTING.equals(state) ||
               LifecycleState.STARTED.equals(state)) {

           if (log.isDebugEnabled()) {
               Exception e = new LifecycleException();
               log.debug(sm.getString("lifecycleBase.alreadyStarted", toString()), e);
           } else if (log.isInfoEnabled()) {
               log.info(sm.getString("lifecycleBase.alreadyStarted", toString()));
           }

           return;
       }

       // `NEW`状态时,执行init()方法
       if (state.equals(LifecycleState.NEW)) {
           init();
       }

       // `FAILED`状态时,执行stop()方法
       else if (state.equals(LifecycleState.FAILED)) {
           stop();
       }

       // 不是`INITIALIZED`和`STOPPED`时,则说明是非法的操作
       else if (!state.equals(LifecycleState.INITIALIZED) &&
               !state.equals(LifecycleState.STOPPED)) {
           invalidTransition(Lifecycle.BEFORE_START_EVENT);
       }

       try {
           // start前的状态设置
           setStateInternal(LifecycleState.STARTING_PREP, null, false);
           // start逻辑,抽象方法,由组件自行实现
           startInternal();
           // start过程中,可能因为某些原因失败,这时需要stop操作
           if (state.equals(LifecycleState.FAILED)) {
               // This is a 'controlled' failure. The component put itself into the
               // FAILED state so call stop() to complete the clean-up.
               stop();
           } else if (!state.equals(LifecycleState.STARTING)) {
               // Shouldn't be necessary but acts as a check that sub-classes are
               // doing what they are supposed to.
               invalidTransition(Lifecycle.AFTER_START_EVENT);
           } else {
               // 设置状态为STARTED
               setStateInternal(LifecycleState.STARTED, null, false);
           }
       } catch (Throwable t) {
           // This is an 'uncontrolled' failure so put the component into the
           // FAILED state and throw an exception.
           ExceptionUtils.handleThrowable(t);
           setStateInternal(LifecycleState.FAILED, null, false);
           throw new LifecycleException(sm.getString("lifecycleBase.startFail", toString()), t);
       }
    }

    stop()方法

    @Override
    public final synchronized void stop() throws LifecycleException {
        // `STOPPING_PREP`、`STOPPING`和STOPPED时,将忽略stop()的执行
        if (LifecycleState.STOPPING_PREP.equals(state) || LifecycleState.STOPPING.equals(state) ||
                LifecycleState.STOPPED.equals(state)) {

            if (log.isDebugEnabled()) {
                Exception e = new LifecycleException();
                log.debug(sm.getString("lifecycleBase.alreadyStopped", toString()), e);
            } else if (log.isInfoEnabled()) {
                log.info(sm.getString("lifecycleBase.alreadyStopped", toString()));
            }

            return;
        }

        // `NEW`状态时,直接将状态变更为`STOPPED`
        if (state.equals(LifecycleState.NEW)) {
            state = LifecycleState.STOPPED;
            return;
        }

        // stop()的执行,必须要是`STARTED`和`FAILED`
        if (!state.equals(LifecycleState.STARTED) && !state.equals(LifecycleState.FAILED)) {
            invalidTransition(Lifecycle.BEFORE_STOP_EVENT);
        }

        try {
            // `FAILED`时,直接触发BEFORE_STOP_EVENT事件
            if (state.equals(LifecycleState.FAILED)) {
                // Don't transition to STOPPING_PREP as that would briefly mark the
                // component as available but do ensure the BEFORE_STOP_EVENT is
                // fired
                fireLifecycleEvent(BEFORE_STOP_EVENT, null);
            } else {
                // 设置状态为STOPPING_PREP
                setStateInternal(LifecycleState.STOPPING_PREP, null, false);
            }

            // stop逻辑,抽象方法,组件自行实现
            stopInternal();

            // Shouldn't be necessary but acts as a check that sub-classes are
            // doing what they are supposed to.
            if (!state.equals(LifecycleState.STOPPING) && !state.equals(LifecycleState.FAILED)) {
                invalidTransition(Lifecycle.AFTER_STOP_EVENT);
            }
            // 设置状态为STOPPED
            setStateInternal(LifecycleState.STOPPED, null, false);
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            setStateInternal(LifecycleState.FAILED, null, false);
            throw new LifecycleException(sm.getString("lifecycleBase.stopFail",toString()), t);
        } finally {
            if (this instanceof Lifecycle.SingleUse) {
                // Complete stop process first
                setStateInternal(LifecycleState.STOPPED, null, false);
                destroy();
            }
        }
    }

    destroy()方法

    @Override
    public final synchronized void destroy() throws LifecycleException {
        // `FAILED`状态时,直接触发stop()逻辑
        if (LifecycleState.FAILED.equals(state)) {
            try {
                // Triggers clean-up
                stop();
            } catch (LifecycleException e) {
                // Just log. Still want to destroy.
                log.warn(sm.getString(
                        "lifecycleBase.destroyStopFail", toString()), e);
            }
        }

        // `DESTROYING`和`DESTROYED`时,忽略destroy的执行
        if (LifecycleState.DESTROYING.equals(state) ||
                LifecycleState.DESTROYED.equals(state)) {

            if (log.isDebugEnabled()) {
                Exception e = new LifecycleException();
                log.debug(sm.getString("lifecycleBase.alreadyDestroyed", toString()), e);
            } else if (log.isInfoEnabled() && !(this instanceof Lifecycle.SingleUse)) {
                // Rather than have every component that might need to call
                // destroy() check for SingleUse, don't log an info message if
                // multiple calls are made to destroy()
                log.info(sm.getString("lifecycleBase.alreadyDestroyed", toString()));
            }

            return;
        }

        // 非法状态判断
        if (!state.equals(LifecycleState.STOPPED) &&
                !state.equals(LifecycleState.FAILED) &&
                !state.equals(LifecycleState.NEW) &&
                !state.equals(LifecycleState.INITIALIZED)) {
            invalidTransition(Lifecycle.BEFORE_DESTROY_EVENT);
        }

        try {
            // destroy前状态设置
            setStateInternal(LifecycleState.DESTROYING, null, false);
           // 抽象方法,组件自行实现
            destroyInternal();
            // destroy后状态设置
            setStateInternal(LifecycleState.DESTROYED, null, false);
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            setStateInternal(LifecycleState.FAILED, null, false);
            throw new LifecycleException(
                    sm.getString("lifecycleBase.destroyFail",toString()), t);
        }
    }

    模板方法

    从上述源码看得出来,LifecycleBase是使用了状态机+模板模式来实现的。模板方法有下面这几个:

    // 初始化方法
    protected abstract void initInternal() throws LifecycleException;
    // 启动方法
    protected abstract void startInternal() throws LifecycleException;
    // 停止方法
    protected abstract void stopInternal() throws LifecycleException;
    // 销毁方法
    protected abstract void destroyInternal() throws LifecycleException;

    总结

    Lifecycle其实非常简单,代码也不复杂,但是剖析其实现对于我们理解组件的生命周期有很大的帮助,也有助于我们对设计模式的回顾。

  • 相关阅读:
    C# 图片与Base64的相互转化
    LeetCode 303. Range Sum Query – Immutable
    LeetCode 300. Longest Increasing Subsequence
    LeetCode 292. Nim Game
    LeetCode 283. Move Zeroes
    LeetCode 279. Perfect Squares
    LeetCode 268. Missing Number
    LeetCode 264. Ugly Number II
    LeetCode 258. Add Digits
    LeetCode 257. Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/edda/p/14200952.html
Copyright © 2011-2022 走看看