贵州十一选五前三直开奖号 | 財經 | 資源 | 理財 | 考研 | 職場 | 論文 | 資格 | 股票學院 |

股票學院: 股票入門 - 股票知識 - 股票術語 - 炒股技巧 - 選股技巧 - 跟莊技巧 - 炒股經驗 - 投資策略 - K線圖 - 均線 - 分時圖 - 成交量 - 波浪理論 - 基本面分析 - 心理分析 - 漲停研究 - 趨勢線 - 江恩理論 - MACD - KDJ - 技術指標 - 財經股票書籍在線閱讀 - 金融類書籍下載 - 銀行學院 - 保險學院 - 外匯學院 - 債券學院 - 股票學院 - 基金學院 - 港股學院 - 黃金學院

當前位置:贵州十一选五前三直开奖号 > 金融云 > 文章正文

体彩贵州十一选五开奖结果查询结果:查漏補缺:連接器在Tomcat中是如何設計的

時間:2019-09-24 12:42:19來源:今日頭條作者:佚名

    贵州十一选五前三直开奖号 www.grzfr.com 從連接器(Connector)源碼說起

    查漏補缺:連接器在Tomcat中是如何設計的

    既然是來解析連接器(Connector),那么我們直接從源碼入手,后面所有源碼我會剔除不重要部分,所以會忽略大部分源碼細節,只關注流程。源碼如下(高能預警,大量代碼):

    1. public class Connector extends LifecycleMBeanBase { 
    2.  public Connector() { 
    3.  this("org.apache.coyote.http11.Http11NioProtocol"); 
    4.  } 
    5.  public Connector(String protocol) { 
    6.  boolean aprConnector = AprLifecycleListener.isAprAvailable() && 
    7.  AprLifecycleListener.getUseAprConnector(); 
    8.  if ("HTTP/1.1".equals(protocol) || protocol == null) { 
    9.  if (aprConnector) { 
    10.  protocolHandlerClassName = "org.apache.coyote.http11.Http11AprProtocol"; 
    11.  } else { 
    12.  protocolHandlerClassName = "org.apache.coyote.http11.Http11NioProtocol"; 
    13.  } 
    14.  } else if ("AJP/1.3".equals(protocol)) { 
    15.  if (aprConnector) { 
    16.  protocolHandlerClassName = "org.apache.coyote.ajp.AjpAprProtocol"; 
    17.  } else { 
    18.  protocolHandlerClassName = "org.apache.coyote.ajp.AjpNioProtocol"; 
    19.  } 
    20.  } else { 
    21.  protocolHandlerClassName = protocol; 
    22.  } 
    23.  // Instantiate protocol handler 
    24.  ProtocolHandler p = null; 
    25.  try { 
    26.  Class<?> clazz = Class.forName(protocolHandlerClassName); 
    27.  p = (ProtocolHandler) clazz.getConstructor().newInstance(); 
    28.  } catch (Exception e) { 
    29.  log.error(sm.getString( 
    30.  "coyoteConnector.protocolHandlerInstantiationFailed"), e); 
    31.  } finally { 
    32.  this.protocolHandler = p; 
    33.  } 
    34.  // Default for Connector depends on this system property 
    35.  setThrowOnFailure(Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")); 
    36.  } 

    我們來看看Connector的構造方法,其實只做了一件事情,就是根據協議設置對應的ProtocolHandler,根據名稱我們知道,這是協議處理類,所以連接器內部的一個重要子??榫褪荘rotocolHandler。

    關于生命周期

    我們看到Connector繼承了LifecycleMBeanBase,我們來看看Connector的最終繼承關系:

    金九銀十,查漏補缺:連接器在Tomcat中是如何設計的

    我們看到最終實現的是Lifecycle接口,我們看看這個接口是何方神圣。我把其接口的注釋拿下來解釋下

    1. /** 
    2.  * Common interface for component life cycle methods. Catalina components 
    3.  * may implement this interface (as well as the appropriate interface(s) for 
    4.  * the functionality they support) in order to provide a consistent mechanism 
    5.  * to start and stop the component. 
    6.  * start() 
    7.  * ----------------------------- 
    8.  * | | 
    9.  * | init() | 
    10.  * NEW -»-- INITIALIZING | 
    11.  * | | | | ------------------«----------------------- 
    12.  * | | |auto | | | 
    13.  * | | \|/ start() \|/ \|/ auto auto stop() | 
    14.  * | | INITIALIZED --»-- STARTING_PREP --»- STARTING --»- STARTED --»--- | 
    15.  * | | | | | 
    16.  * | |destroy()| | | 
    17.  * | --»-----«-- ------------------------«-------------------------------- ^ 
    18.  * | | | | 
    19.  * | | \|/ auto auto start() | 
    20.  * | | STOPPING_PREP ----»---- STOPPING ------»----- STOPPED -----»----- 
    21.  * | \|/ ^ | ^ 
    22.  * | | stop() | | | 
    23.  * | | -------------------------- | | 
    24.  * | | | | | 
    25.  * | | | destroy() destroy() | | 
    26.  * | | FAILED ----»------ DESTROYING ---«----------------- | 
    27.  * | | ^ | | 
    28.  * | | destroy() | |auto | 
    29.  * | --------»----------------- \|/ | 
    30.  * | DESTROYED | 
    31.  * | | 
    32.  * | stop() | 
    33.  * ----»-----------------------------»------------------------------ 
    34.  * 
    35.  * Any state can transition to FAILED. 
    36.  * 
    37.  * Calling start() while a component is in states STARTING_PREP, STARTING or 
    38.  * STARTED has no effect. 
    39.  * 
    40.  * Calling start() while a component is in state NEW will cause init() to be 
    41.  * called immediately after the start() method is entered. 
    42.  * 
    43.  * Calling stop() while a component is in states STOPPING_PREP, STOPPING or 
    44.  * STOPPED has no effect. 
    45.  * 
    46.  * Calling stop() while a component is in state NEW transitions the component 
    47.  * to STOPPED. This is typically encountered when a component fails to start and 
    48.  * does not start all its sub-components. When the component is stopped, it will 
    49.  * try to stop all sub-components - even those it didn't start. 
    50.  * 
    51.  * Attempting any other transition will throw {@link LifecycleException}. 
    52.  * 
    53.  * </pre> 
    54.  * The {@link LifecycleEvent}s fired during state changes are defined in the 
    55.  * methods that trigger the changed. No {@link LifecycleEvent}s are fired if the 
    56.  * attempted transition is not valid. 

    相關閱讀

    焦點圖文

    關于我們 | 廣告服務 | 商務合作 | 網站地圖

    版權所有 Copyright(C)2018-2020 蘇州騏云躍網絡科技有限公司,未經授權禁止復制或建立鏡像,否則將依法追究法律責任!
    聲明:我們不做任何形式的代客理財及投資指導,凡是以天下金融網名義做股票推薦的行為均屬違法!
    廣告商的言論與行為均與天下金融網無關!股市有風險,投資需謹慎。
    蘇公網安備 32050502000166號
    蘇ICP備14018528號
    商務合作:贵州十一选五前三直开奖号

    天下金融網版權所有