生命周期管理:LifeCycle
Server及其它组件Server后续组件生命周期及初始化Server的依赖结构LifeCycle接口理解Lifecycle主要有两点第一是三类接口方法第二是状态机。一个标准的LifeCycle有哪些方法分三类去看javapublic interface Lifecycle { /** 第1类针对监听器 **/ // 添加监听器 public void addLifecycleListener(LifecycleListener listener); // 获取所以监听器 public LifecycleListener[] findLifecycleListeners(); // 移除某个监听器 public void removeLifecycleListener(LifecycleListener listener); /** 第2类针对控制流程 **/ // 初始化方法 public void init() throws LifecycleException; // 启动方法 public void start() throws LifecycleException; // 停止方法和start对应 public void stop() throws LifecycleException; // 销毁方法和init对应 public void destroy() throws LifecycleException; /** 第3类针对状态 **/ // 获取生命周期状态 public LifecycleState getState(); // 获取字符串类型的生命周期状态 public String getStateName(); }LifeCycle状态机有哪些状态Tomcat 给各个组件定义了一些生命周期中的状态在枚举类 LifecycleState 里javapublic enum LifecycleState { NEW(false, null), INITIALIZING(false, Lifecycle.BEFORE_INIT_EVENT), INITIALIZED(false, Lifecycle.AFTER_INIT_EVENT), STARTING_PREP(false, Lifecycle.BEFORE_START_EVENT), STARTING(true, Lifecycle.START_EVENT), STARTED(true, Lifecycle.AFTER_START_EVENT), STOPPING_PREP(true, Lifecycle.BEFORE_STOP_EVENT), STOPPING(false, Lifecycle.STOP_EVENT), STOPPED(false, Lifecycle.AFTER_STOP_EVENT), DESTROYING(false, Lifecycle.BEFORE_DESTROY_EVENT), DESTROYED(false, Lifecycle.AFTER_DESTROY_EVENT), FAILED(false, null); private final boolean available; private final String lifecycleEvent; private LifecycleState(boolean available, String lifecycleEvent) { this.available available; this.lifecycleEvent lifecycleEvent; } …… }它们之间的关系是怎么样的呢在Lifecycle.java源码中有相关的注释看不太清楚的可以看下图LifecycleBase - LifeCycle的基本实现LifecycleBase是Lifecycle的基本实现。监听器相关生命周期监听器保存在一个线程安全的CopyOnWriteArrayList中。所以add和remove都是直接调用此List的相应方法。 findLifecycleListeners返回的是一个数组为了线程安全所以这儿会生成一个新数组。javaprivate final ListLifecycleListener 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); }生命周期相关initjavaOverride 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); } }我们再来看看invalidTransition方法该方法直接抛出异常。javaprivate void invalidTransition(String type) throws LifecycleException { String msg sm.getString(lifecycleBase.invalidTransition, type, toString(), state); throw new LifecycleException(msg); }setStateInternal方法用于维护状态同时在状态转换成功之后触发事件。为了状态的可见性所以state声明为volatile类型的。javaprivate 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); } }设置完 state 的状态之后就触发该状态的事件了通知事件监听器java/** * The list of registered LifecycleListeners for event notifications. */ private final ListLifecycleListener lifecycleListeners new CopyOnWriteArrayList(); protected void fireLifecycleEvent(String type, Object data) { LifecycleEvent event new LifecycleEvent(this, type, data); for (LifecycleListener listener : lifecycleListeners) { listener.lifecycleEvent(event); } }这里的 LifecycleListener 对象是在 Catalina 对象解析 server.xml 文件时就已经创建好并加到 lifecycleListeners 里的。这个不是特别重要就不细讲了。startjavaOverride 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)) {