以 jetty7 作為分析目標(biāo), Jetty 是由一個(gè)或多個(gè) connector 核心組件以及一些列 handler 組件和一個(gè)線程池組成,看一下結(jié)構(gòu)圖:
C onnector 負(fù)責(zé)監(jiān)聽接收客戶連接請(qǐng)求,而 handler 組件則負(fù)責(zé)處理請(qǐng)求并給予響應(yīng),前面兩個(gè)組件工作所需要的線程資源都直接從線程池 ThreadPool 中獲取。 Jetty Server 可以有多個(gè) connector 在不同的端口上監(jiān)聽客戶請(qǐng)求,而每個(gè) connector 根據(jù)具體的使用場(chǎng)景不同可以有不同的實(shí)現(xiàn),例如采用非阻塞 NioConnector 、阻塞 SocketConnector 等等,而對(duì)于請(qǐng)求處理的 handler 組件,也根據(jù)具體需要可以使用不同的 handler ,此種設(shè)計(jì)提高了 jetty 的靈活性,需要 servlet ,則可以使用 servletHandler ,需要 session ,則再增加一個(gè) sessionHandler ,也就是說我們完全可以不使用 servlet 或者 session ,只要不配置這個(gè) handler 就行了。
要啟動(dòng)和協(xié)調(diào)上訴核心組件工作, Jetty 提供了一個(gè) Server 類來做這個(gè)事情 , 也就是說 Server 是應(yīng)用的起始點(diǎn),他負(fù)責(zé)創(chuàng)建并初始化 connector 、 handler 、 ThreadPool 組件,然后調(diào)用 start 方法啟動(dòng)他們,讓所有組件都處于待命狀態(tài),因此 Server 類是一個(gè)比較重要的 Fa?ade, 值得注意的 Server 類本身也是一個(gè) handler.
一、 組件生命周期
對(duì) 于 jetty 來說,每個(gè)組件都有其生命周期, jetty 采用了統(tǒng)一的 LifeCyle 接口來控制,我們來看下,類圖結(jié)構(gòu):
c onnector,handler 等組件全部都直接或間接實(shí)現(xiàn)了 LifeCyle 接口,剛才說了 Server 也是 Handler ,同時(shí)他也是啟動(dòng)或協(xié)調(diào)組件工作的類,也就是說 Server 可以通過 LifeCyle 接口控制其他組件的生命周期,通過 start 方法可以啟動(dòng) server, 通過 stop 則關(guān)閉了 server 。
二、 Connector 組件
Connnetor 在實(shí)現(xiàn)上有 NIO 、 BIO 兩種實(shí)現(xiàn)方式,并且支持 AJP 協(xié)議、和 SSL 。
三、 Handler 組件
所有的 handler 組件都實(shí)現(xiàn)了 Handler 接口,可以看到, Handler 是可以以鏈表的形式相互組合的, Server 作為服務(wù)入口,本身也是 handler ,他繼承了 HandlerWrapper 接口,我們看以看到他帶了一個(gè) handler 的引用變量,我們可以注入 ServletHandler 支持 servlet, 注入 WebAppContext 則支持我們的 webapp 應(yīng)用。
四、 啟動(dòng)過程
先看下 jetty 的目錄結(jié)構(gòu)
看幾個(gè)主要目錄的含義,
Bin 目錄定義了啟動(dòng) jetty 需要的 sh 文件,主要用在 linux 中, windows 中可以直接 java start.jar 啟動(dòng)服務(wù)器,
Contexts 目錄主要放置跟應(yīng)用相關(guān)的 context 配置文件,跟應(yīng)用相關(guān)
etc 目錄放置跟服務(wù)器相關(guān)的配置文件,其中會(huì)定義 contexts 目錄所在的位置
lib 是服務(wù)器所需要的 jar 包
webapps 是放置應(yīng)用程序的位置,當(dāng)然也可以通過在 contexts 中或者 etc 中自定義
我們從外部啟動(dòng)一個(gè) jetty 服務(wù)器的過程:
首先從 Start.jar 開始,這個(gè) jar 定義了解析命令行的 Main 這個(gè)類, Main 主要負(fù)責(zé)解析 start.ini 配置文件 ,start.ini 中定義了 JVM 需要的參數(shù)以及 etc 目錄中用到的 xml 配置文件,如下圖:
然后由 Config 類解析出 stat.ini 中 OPTIONS 選項(xiàng)指定的模塊的包的位置用來加入到 classpath 中,這些模塊的包都定義在 start.config 文件中 ( 該文件可以在 start.jar 包中找到 ) ,截取一個(gè)片段給大家看下:
這個(gè)文件的配置是需要有一定的語法在里面的,有興趣的可以研究一下,也就是說,通過在 start.ini 中定義 OPTIONS 以及在 start.config 中定義模塊路徑就可以確定把哪些 jar 加入到環(huán)境變量中。
以上準(zhǔn)備工作做完之后,就可以真正開始服務(wù)器的處理了,這時(shí)你有兩種選擇,第一種是在本進(jìn)程中通過反射方式啟動(dòng),但是缺點(diǎn)是 start.ini 中配置的 JVM 參數(shù)就形同虛設(shè)了,因?yàn)? java 進(jìn)程已經(jīng)起來了,不能再按照新的堆參數(shù)等重新設(shè)置了;第二種方式就是重新啟動(dòng)一個(gè)進(jìn)程,就可以重新設(shè)置參數(shù),前面說了, start.ini 中得到了啟動(dòng)參數(shù), start.config 中有了 MainClass 和 Classpath 需要的 jar 包,則可以直接用 java xxx 方式啟動(dòng)了,要使用這種方式啟動(dòng),只需要在 start.ini 中配置 –exec 參數(shù)即可。
MainClass 默認(rèn)是 XmlConfigration 類,當(dāng)然自定義的話,可以在 start.config 中去更改, XmlConfigration 做幾件事情: 1 、根據(jù) start.ini 中的定義的配置文件進(jìn)行解析 , 例如 etc/jetty.xml 等 2 、通過自己的 IOC 將這些服務(wù)組件組裝在一起 3 、最后調(diào)用 start 方法啟動(dòng)這些組件。
==========================
未完待續(xù).....
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
