本篇內(nèi)容主要講解“Tomcat的啟動(dòng)過(guò)程是怎樣的”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Tomcat的啟動(dòng)過(guò)程是怎樣的”吧!
目前累計(jì)服務(wù)客戶數(shù)千家,積累了豐富的產(chǎn)品開發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹立企業(yè)形象,為客戶提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。創(chuàng)新互聯(lián)公司始終以務(wù)實(shí)、誠(chéng)信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過(guò)對(duì)領(lǐng)先技術(shù)的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究、對(duì)客戶形象的視覺傳遞、對(duì)應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
1.Tomcat分析
阿粉知道作為一個(gè) Java 資深開發(fā)人員,對(duì) Tomcat 那是再熟悉不過(guò)了,bin目錄、conf目錄、webapps目錄,對(duì)這些目錄熟悉的簡(jiǎn)直不能再熟悉了。一言不合就是一個(gè)shutdown.sh,或者來(lái)個(gè)shutdown.bat,但是你知道你的啟動(dòng)startup.bat,和startup.sh他們的啟動(dòng)過(guò)程是什么過(guò)程么?接下來(lái)我們就開始進(jìn)入分析吧。
2.Tomcat的整體結(jié)構(gòu)圖
這個(gè)整體結(jié)構(gòu)圖可不是大家想的目錄結(jié)構(gòu)圖,目錄結(jié)構(gòu)圖阿粉就不給大家展示了,自己去打開你的 Tomcat,里面就有你想看到目錄結(jié)構(gòu)圖,那么整體結(jié)構(gòu)圖是什么樣子的呢?
給大家解釋一下這個(gè)圖的意思,
Server:整個(gè) main方法里面的存在也很簡(jiǎn)單,先進(jìn)行init的操作,然后再執(zhí)行start,也就是說(shuō),啟動(dòng)過(guò)程中,首先要進(jìn)行初始化,然后接下來(lái)再進(jìn)行啟動(dòng),最后階段在來(lái)個(gè)stop,這樣才算完整嘛。 load方法:其實(shí)說(shuō)白了load方法就是根據(jù)server.xml文件創(chuàng)建Server并且調(diào)用Server的init方法進(jìn)行初始化。 start方法:start方法很直白,啟動(dòng)服務(wù)器。 stop方法:stop方法同樣,停止服務(wù)器。 在這里的start方法和stop方法調(diào)用的分別就是調(diào)用了Server內(nèi)部的start和stop方法,而這三個(gè)方法都是按照?qǐng)D中的層級(jí)結(jié)構(gòu)來(lái)的,先從Server的load,start,stop,然后Server的start再調(diào)用Service的start,而Service的start調(diào)用的就是Connector和Container的start方法了,這從外到內(nèi)的啟動(dòng),就可以把Tomcat完整的啟動(dòng)起來(lái)了。 我們?cè)诮酉聛?lái)就繼續(xù)從外到內(nèi)的啟動(dòng)開始分析一波。 3.1 Catalina啟動(dòng)過(guò)程 上面的啟動(dòng)入口我們已經(jīng)成功找到了,那么我們就繼續(xù)來(lái),對(duì)象初始化完成后,執(zhí)行了init的方法 就是上面的這個(gè),如果參數(shù)為空了,那么就開始調(diào)用start了,那么start方法是什么呢? 上面的start方法就是直接使用invoke的方法映射到了catalinaDaemon,也就是到了Catalina的start的方法上, 而這個(gè)Catalina的啟動(dòng)無(wú)非也就是調(diào)用了同樣的方法,setAwait方法,load方法,start方法, setAwait方法:用于設(shè)置Server啟動(dòng)完成時(shí),是否進(jìn)入等待,如果是true,那就等待,如果不是false,那就不進(jìn)入等待。 load方法:創(chuàng)建并且初始化Server, start方法:同樣是啟動(dòng)服務(wù)器 同樣的setAwait方法比較少,阿粉就不給大家看了,無(wú)非就是個(gè)判斷,而load方法一定得看, 而從這里就開始進(jìn)入下一步了,Server的啟動(dòng)過(guò)程,因?yàn)閺腃atalina里面已經(jīng)找到了getServer的初始化方法,接下來(lái)就是要進(jìn)行Server的初始化,然后加載,然后啟動(dòng)的過(guò)程了。 3.2 Server的啟動(dòng)過(guò)程 Server是Tomcat里面的接口,而不是類,那么我們就只能去找實(shí)現(xiàn)它的子類來(lái)于是就找到了StandardServer extends LifecycleMBeanBase implements Server。 阿粉一看有繼承,還有實(shí)現(xiàn),那就先看看LifecycleMBeanBase這個(gè)被繼承的類,于是再次去看了它, 嗯?還有繼承?繼續(xù)往下扒拉, 終于算是找到了, 阿粉一看這init方法和start方法又調(diào)用了initInternal()和startInternal(),找來(lái)找去又回去了,而阿粉也從這里知道了,模板方法,是有自己的子類具體實(shí)現(xiàn) 于是回到了StandardServer自己的init和start方法, 總得來(lái)說(shuō)就是,StandardServer繼承自LifecycleMBeanBase,而LifecycleMBeanBase繼承自LifecycleBase,而LifecycleBase類中的模板方法,又讓自己的子類去進(jìn)行具體的實(shí)現(xiàn),但是我們要知道他的Tomcat生命周期中存在這些內(nèi)容才行。 圖中都說(shuō)了,Server里面有Service,那么一定就有,我們得去找找看,于是阿粉再次去找并且去看它到底是個(gè)什么意思, 位置是在Server的接口中出現(xiàn)了增加和刪除Service的方法,Server的init方法和start方法循環(huán)去調(diào)用每個(gè)Service的init方法和start方法。 接下來(lái)我們看看Service的具體實(shí)現(xiàn),找到StandardService: 而在方法中主要調(diào)用Executor,mapperListener,executor的init方法。 connector之前已經(jīng)有了,而這個(gè)mapperListener就是Mapper的監(jiān)聽器,用來(lái)堅(jiān)挺container容器的變化。 到此,相信大家對(duì)“Tomcat的啟動(dòng)過(guò)程是怎樣的”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!Bootstrap bootstrap = new Bootstrap(); try { bootstrap.init(); } catch (Throwable var3) {
public void start() throws Exception { if (this.catalinaDaemon == null) { this.init(); } Method method = this.catalinaDaemon.getClass().getMethod("start", (Class[])null); method.invoke(this.catalinaDaemon, (Object[])null); }
if (!this.loaded) { this.loaded = true; long t1 = System.nanoTime(); try { inputSource.setByteStream((InputStream)inputStream); digester.push(this); digester.parse(inputSource); break label242; } catch (SAXParseException var28) { log.warn("Catalina.start using " + this.getConfigFile() + ": " + var28.getMessage()); return; } catch (Exception var29) { log.warn("Catalina.start using " + this.getConfigFile() + ": ", var29); } } finally { if (inputStream != null) { try { ((InputStream)inputStream).close(); } catch (IOException var23) { ; } } } return; } try { //此處同樣調(diào)用的Server的init方法, this.getServer().init(); } catch (LifecycleException var24) { if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) { throw new Error(var24); } log.error("Catalina.start", var24); } long t2 = System.nanoTime(); if (log.isInfoEnabled()) { log.info("Initialization processed in " + (t2 - t1) / 1000000L + " ms"); } }
public abstract class LifecycleMBeanBase extends LifecycleBase implements JmxEnabled {
public abstract class LifecycleBase implements Lifecycle {
protected void startInternal() throws LifecycleException { this.fireLifecycleEvent("configure_start", (Object)null); this.setState(LifecycleState.STARTING); this.globalNamingResources.start(); Object var1 = this.servicesLock; synchronized(this.servicesLock) { for(int i = 0; i < this.services.length; ++i) { this.services[i].start(); } } }
public void addService(Service service) { service.setServer(this); Object var2 = this.servicesLock; synchronized(this.servicesLock) { Service[] results = new Service[this.services.length + 1]; System.arraycopy(this.services, 0, results, 0, this.services.length); results[this.services.length] = service; this.services = results; if (this.getState().isAvailable()) { try { service.start(); } catch (LifecycleException var6) { ; } } this.support.firePropertyChange("service", (Object)null, service); } }
protected void initInternal() throws LifecycleException { super.initInternal(); if (this.engine != null) { this.engine.init(); } Executor[] arr$ = this.findExecutors(); int len$ = arr$.length; int len$; for(len$ = 0; len$ < len$; ++len$) { Executor executor = arr$[len$]; if (executor instanceof JmxEnabled) { ((JmxEnabled)executor).setDomain(this.getDomain()); } executor.init(); } this.mapperListener.init(); Object var11 = this.connectorsLock; synchronized(this.connectorsLock) { Connector[] arr$ = this.connectors; len$ = arr$.length; for(int i$ = 0; i$ < len$; ++i$) { Connector connector = arr$[i$]; try { connector.init(); } catch (Exception var9) { String message = sm.getString("standardService.connector.initFailed", new Object[]{connector}); log.error(message, var9); if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) { throw new LifecycleException(message); } } } } }
分享標(biāo)題:Tomcat的啟動(dòng)過(guò)程是怎樣的
標(biāo)題URL:http://weahome.cn/article/jhesgg.html