<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Tomcat源碼分析 | 一文詳解生命周期機制Lifecycle

          共 23183字,需瀏覽 47分鐘

           ·

          2021-03-30 21:10

          目錄

          • 什么是Lifecycle?
          • Lifecycle方法
          • LifecycleBase
            • 增加、刪除和獲取監(jiān)聽器
            • init()
            • start()
            • stop()
            • destroy()
            • 模板方法
          • 總結

          前言

          Tomcat里面有各種各樣的組件,每個組件各司其職,組件之間又相互協作共同完成web服務器這樣的工程。在這些組件之上,Lifecycle(生命周期機制)至關重要!在學習各個組件之前,我們需要看看Lifecycle是什么以及能做什么?實現原理又是怎樣的?

          什么是Lifecycle?

          Lifecycle,其實就是一個狀態(tài)機,對組件的由生到死狀態(tài)的管理。

          當組件在STARTING_PREP、STARTING或STARTED時,調用start()方法沒有任何效果

          當組件在NEW狀態(tài)時,調用start()方法會導致init()方法被立刻執(zhí)行,隨后start()方法被執(zhí)行

          當組件在STOPPING_PREP、STOPPING或STOPPED時,調用stop()方法沒有任何效果

          當一個組件在NEW狀態(tài)時,調用stop()方法會將組件狀態(tài)變更為STOPPED,比較典型的場景就是組件啟動失敗,其子組件還沒有啟動。當一個組件停止的時候,它將嘗試停止它下面的所有子組件,即使子組件還沒有啟動。

          Lifecycle方法

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

          public interface Lifecycle {
              // 添加監(jiān)聽器
              public void addLifecycleListener(LifecycleListener listener);
              // 獲取所以監(jiān)聽器
              public LifecycleListener[] findLifecycleListeners();
              // 移除某個監(jiān)聽器
              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;
              // 獲取生命周期狀態(tài)
              public LifecycleState getState();
              // 獲取字符串類型的生命周期狀態(tài)
              public String getStateName();
          }

          LifecycleBase

          LifecycleBase是Lifecycle的基本實現。我們逐一來看Lifecycle的各個方法。

          增加、刪除和獲取監(jiān)聽器

          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. 生命周期監(jiān)聽器保存在一個線程安全的List中,CopyOnWriteArrayList。所以add和remove都是直接調用此List的相應方法。
          2. findLifecycleListeners返回的是一個數組,為了線程安全,所以這兒會生成一個新數組。

          init()方法

          @Override
          public final synchronized void init() throws LifecycleException {
              // 非NEW狀態(tài),不允許調用init()方法
              if (!state.equals(LifecycleState.NEW)) {
                  invalidTransition(Lifecycle.BEFORE_INIT_EVENT);
              }

              try {
                  // 初始化邏輯之前,先將狀態(tài)變更為`INITIALIZING`
                  setStateInternal(LifecycleState.INITIALIZING, nullfalse);
                  // 初始化,該方法為一個abstract方法,需要組件自行實現
                  initInternal();
                  // 初始化完成之后,狀態(tài)變更為`INITIALIZED`
                  setStateInternal(LifecycleState.INITIALIZED, nullfalse);
              } catch (Throwable t) {
                  // 初始化的過程中,可能會有異常拋出,這時需要捕獲異常,并將狀態(tài)變更為`FAILED`
                  ExceptionUtils.handleThrowable(t);
                  setStateInternal(LifecycleState.FAILED, nullfalse);
                  throw new LifecycleException(
                          sm.getString("lifecycleBase.initFail",toString()), t);
              }
          }

          setStateInternal方法用于維護狀態(tài),同時在狀態(tài)轉換成功之后觸發(fā)事件。為了狀態(tài)的可見性,所以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));
              }

              // 是否校驗狀態(tài)
              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());
                  }
              }

              // 設置狀態(tài)
              this.state = state;
              // 觸發(fā)事件
              String lifecycleEvent = state.getLifecycleEvent();
              if (lifecycleEvent != null) {
                  fireLifecycleEvent(lifecycleEvent, data);
              }
          }

          我們看看fireLifecycleEvent方法,

          public void fireLifecycleEvent(String type, Object data) {
              // 事件監(jiān)聽,觀察者模式的另一種方式
              LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
              LifecycleListener interested[] = listeners;// 監(jiān)聽器數組 關注 事件(啟動或者關閉事件)
              // 循環(huán)通知所有生命周期時間偵聽器
              for (int i = 0; i < interested.length; i++)
                  // 每個監(jiān)聽器都有自己的邏輯
                  interested[i].lifecycleEvent(event);
          }

          首先, 創(chuàng)建一個事件對象, 然通知所有的監(jiān)聽器發(fā)生了該事件.并做響應.

          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`狀態(tài)時,執(zhí)行init()方法
             if (state.equals(LifecycleState.NEW)) {
                 init();
             }

             // `FAILED`狀態(tài)時,執(zhí)行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前的狀態(tài)設置
                 setStateInternal(LifecycleState.STARTING_PREP, nullfalse);
                 // 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 {
                     // 設置狀態(tài)為STARTED
                     setStateInternal(LifecycleState.STARTED, nullfalse);
                 }
             } 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, nullfalse);
                 throw new LifecycleException(sm.getString("lifecycleBase.startFail", toString()), t);
             }
          }

          stop()方法

          @Override
          public final synchronized void stop() throws LifecycleException {
              // `STOPPING_PREP`、`STOPPING`和STOPPED時,將忽略stop()的執(zhí)行
              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`狀態(tài)時,直接將狀態(tài)變更為`STOPPED`
              if (state.equals(LifecycleState.NEW)) {
                  state = LifecycleState.STOPPED;
                  return;
              }

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

              try {
                  // `FAILED`時,直接觸發(fā)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 {
                      // 設置狀態(tài)為STOPPING_PREP
                      setStateInternal(LifecycleState.STOPPING_PREP, nullfalse);
                  }

                  // 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);
                  }
                  // 設置狀態(tài)為STOPPED
                  setStateInternal(LifecycleState.STOPPED, nullfalse);
              } catch (Throwable t) {
                  ExceptionUtils.handleThrowable(t);
                  setStateInternal(LifecycleState.FAILED, nullfalse);
                  throw new LifecycleException(sm.getString("lifecycleBase.stopFail",toString()), t);
              } finally {
                  if (this instanceof Lifecycle.SingleUse) {
                      // Complete stop process first
                      setStateInternal(LifecycleState.STOPPED, nullfalse);
                      destroy();
                  }
              }
          }

          destroy()方法

          @Override
          public final synchronized void destroy() throws LifecycleException {
              // `FAILED`狀態(tài)時,直接觸發(fā)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的執(zhí)行
              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;
              }

              // 非法狀態(tài)判斷
              if (!state.equals(LifecycleState.STOPPED) &&
                      !state.equals(LifecycleState.FAILED) &&
                      !state.equals(LifecycleState.NEW) &&
                      !state.equals(LifecycleState.INITIALIZED)) {
                  invalidTransition(Lifecycle.BEFORE_DESTROY_EVENT);
              }

              try {
                  // destroy前狀態(tài)設置
                  setStateInternal(LifecycleState.DESTROYING, nullfalse);
                 // 抽象方法,組件自行實現
                  destroyInternal();
                  // destroy后狀態(tài)設置
                  setStateInternal(LifecycleState.DESTROYED, nullfalse);
              } catch (Throwable t) {
                  ExceptionUtils.handleThrowable(t);
                  setStateInternal(LifecycleState.FAILED, nullfalse);
                  throw new LifecycleException(
                          sm.getString("lifecycleBase.destroyFail",toString()), t);
              }
          }

          模板方法

          從上述源碼看得出來,LifecycleBase是使用了狀態(tài)機+模板模式來實現的。模板方法有下面這幾個:

          // 初始化方法
          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其實非常簡單,代碼也不復雜,但是剖析其實現對于我們理解組件的生命周期有很大的幫助,也有助于我們對設計模式的回顧。

          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲日韩精品秘 在线观看 | 久久久精品少妇 | 超碰青青在线五月 | 亚洲日本中文字幕 | 人人澡人人摸 |