从连接器(connector)源码说起
既然是来解析连接器(connector),那么我们直接从源码入手,后面所有源码我会剔除不重要部分,所以会忽略大部分源码细节,只关注流程。源码如下(高能预警,大量代码):
publicclassconnectorextendslifecyclembeanbase{publicconnector(){this(org.apache.coyote.http11.http11nioprotocol);}publicconnector(stringprotocol){booleanaprconnector=aprlifecyclelistener.isapravailable()&&aprlifecyclelistener.getuseaprconnector();if(http/1.1.equals(protocol)||protocol==null){if(aprconnector){protocolhandlerclassname=org.apache.coyote.http11.http11aprprotocol;}else{protocolhandlerclassname=org.apache.coyote.http11.http11nioprotocol;}}elseif(ajp/1.3.equals(protocol)){if(aprconnector){protocolhandlerclassname=org.apache.coyote.ajp.ajpaprprotocol;}else{protocolhandlerclassname=org.apache.coyote.ajp.ajpnioprotocol;}}else{protocolhandlerclassname=protocol;}//instantiateprotocolhandlerprotocolhandlerp=null;try{class<?>clazz=class.forname(protocolhandlerclassname);p=(protocolhandler)clazz.getconstructor().newinstance();}catch(exceptione){log.error(sm.getstring(coyoteconnector.protocolhandlerinstantiationfailed),e);}finally{this.protocolhandler=p;}//defaultforconnectordependsonthissystempropertysetthrowonfailure(boolean.getboolean(org.apache.catalina.startup.exit_on_init_failure));}我们来看看connector的构造方法,其实只做了一件事情,就是根据协议设置对应的protocolhandler,根据名称我们知道,这是协议处理类,所以连接器内部的一个重要子模块就是protocolhandler。
关于生命周期
我们看到connector继承了lifecyclembeanbase,我们来看看connector的最终继承关系:
我们看到最终实现的是lifecycle接口,我们看看这个接口是何方神圣。我把其接口的注释拿下来解释下
/***commoninterfaceforcomponentlifecyclemethods.catalinacomponents*mayimplementthisinterface(aswellastheappropriateinterface(s)for*thefunctionalitytheysupport)inordertoprovideaconsistentmechanism*tostartandstopthecomponent.*start()*-----------------------------*||*|init()|*new-?--initializing|*||||------------------?-----------------------*|||auto|||*||\|/start()\|/\|/autoautostop()|*||initialized--?--starting_prep--?-starting--?-started--?---|*|||||*||destroy()|||*|--?-----?--------------------------?--------------------------------^*||||*||\|/autoautostart()|*||stopping_prep----?----stopping------?-----stopped-----?-----*|\|/^|^*||stop()|||*||--------------------------||*|||||*|||destroy()destroy()||*||failed----?------destroying---?-----------------|*||^||*||destroy()||auto|*|--------?-----------------\|/|*|destroyed|*||*|stop()|*----?-----------------------------?------------------------------**anystatecantransitiontofailed.**callingstart()whileacomponentisinstatesstarting_prep,startingor*startedhasnoeffect.**callingstart()whileacomponentisinstatenewwillcauseinit()tobe*calledimmediatelyafterthestart()methodisentered.**callingstop()whileacomponentisinstatesstopping_prep,stoppingor*stoppedhasnoeffect.**callingstop()whileacomponentisinstatenewtransitionsthecomponent*tostopped.thisistypicallyencounteredwhenacomponentfailstostartand*doesnotstartallitssub-components.whenthecomponentisstopped,itwill*trytostopallsub-components-eventhoseitdidn'tstart.**attemptinganyothertransitionwillthrow{@linklifecycleexception}.**</pre>*the{@linklifecycleevent}sfiredduringstatechangesaredefinedinthe*methodsthattriggerthechanged.no{@linklifecycleevent}sarefiredifthe*attemptedtransitionisnotvalid.这段注释翻译就是,这个接口是提供给组件声明周期管理的,并且提供了声明周期流转图。这里我们只需要知道正常流程即可:
new--->init()---->start()---->stop()--->destory()从生命周期探索连接器
根据上面的生命周期说明,我们可以知道连接器(connector)就是按照如此的声明周期管理的,所以我们找到了线索,所以连接器肯定会先初始化然后再启动。我们查看其initinternal()方法可以知道连接器初始化做了什么事情,源码如下:
@overrideprotectedvoidinitinternal()throwslifecycleexception{super.initinternal();if(protocolhandler==null){thrownewlifecycleexception(sm.getstring(coyoteconnector.protocolhandlerinstantiationfailed));}//initializeadapteradapter=newcoyoteadapter(this);protocolhandler.setadapter(adapter);if(service!=null){protocolhandler.setutilityexecutor(service.getserver().getutilityexecutor());}//makesureparsebodymethodssethasadefaultif(null==parsebodymethodsset){setparsebodymethods(getparsebodymethods());}if(protocolhandler.isaprrequired()&&!aprlifecyclelistener.isinstancecreated()){thrownewlifecycleexception(sm.getstring(coyoteconnector.protocolhandlernoaprlistener,getprotocolhandlerclassname()));}if(protocolhandler.isaprrequired()&&!aprlifecyclelistener.isapravailable()){thrownewlifecycleexception(sm.getstring(coyoteconnector.protocolhandlernoaprlibrary,getprotocolhandlerclassname()));}if(aprlifecyclelistener.isapravailable()&&aprlifecyclelistener.getuseopenssl()&&protocolhandlerinstanceofabstracthttp11jsseprotocol){abstracthttp11jsseprotocol<?>jsseprotocolhandler=(abstracthttp11jsseprotocol<?>)protocolhandler;if(jsseprotocolhandler.issslenabled()&&jsseprotocolhandler.getsslimplementationname()==null){//openssliscompatiblewiththejsseconfiguration,souseitifaprisavailablejsseprotocolhandler.setsslimplementationname(opensslimplementation.class.getname());}}try{protocolhandler.init();}catch(exceptione){thrownewlifecycleexception(sm.getstring(coyoteconnector.protocolhandlerinitializationfailed),e);}}}根据上面源码,我们发现主要是处理protocolhandler并初始化它,同时我们注意到了protocolhandler 设置了一个适配器,我们看看这个适配器是做啥的,跟踪源码如下:
/***theadapter,usedtocalltheconnector.**&nbs
邮件营销中采集资讯应该注意的几个点seo优化网站的数据分析怎么做?怎么判断美国云服务器是否适合?最常用的网页制作软件有哪些高转化的企业网站SEO要怎么做?德阳网站建设:网站开发需要多少钱商城网站建设应考虑的几个问题浅析企业网站内容设计的三点核心原则