[转载]三、二、一 …… Geronimo!,第 3 部分: 状态问题
三、二、一 …… Geronimo!,第 3 部分: 狀態(tài)問(wèn)題
盡管計(jì)算機(jī)和 Web 使日常的任務(wù)變得更加便利,但它們也帶來(lái)了一些新的挑戰(zhàn)。如今的 Internet,其運(yùn)行再也不僅僅限于對(duì) HTML 編碼的 Web 頁(yè)面的請(qǐng)求做出響應(yīng)。當(dāng)今的 Web 站點(diǎn)必須能夠維護(hù)大量的用戶(hù)信息,并且能夠管理許多復(fù)雜的任務(wù)。幸運(yùn)的是,現(xiàn)在已經(jīng)有一些前沿的工具能夠用來(lái)簡(jiǎn)化這類(lèi)狀態(tài)問(wèn)題。其中一種具有行業(yè)水準(zhǔn)的解 決方案脫穎而出,它就是會(huì)話狀態(tài)。本文演示了 Apache Geronimo 如何能夠維護(hù)成千上萬(wàn)個(gè)同時(shí)連接的狀態(tài),這樣一來(lái),IT 經(jīng)理們就可以松口氣了。
我們創(chuàng)建計(jì)算機(jī)和通信技術(shù)是用來(lái)簡(jiǎn)化生活的,不是嗎?盡管表面看起來(lái)并非如此 —— 這些技術(shù)的確帶來(lái)了其自身的一些復(fù)雜性 —— 但它們的確可以讓我們實(shí)現(xiàn)一些原來(lái)所不能實(shí)現(xiàn)的事情,從這個(gè)意義上講,它們確實(shí)讓人們的生活變得簡(jiǎn)單和方便了。
例如,現(xiàn)在您可以從早餐桌走到起居室的電腦旁來(lái)查看一下當(dāng)前的氣象雷達(dá)或道路狀況,或者訂購(gòu)一盆新的室內(nèi)植物,當(dāng)然也可以結(jié)算支票簿、支付賬單等等,而這在幾十年前(花如此少的力氣)簡(jiǎn)直是不可想象的。這確實(shí)是一種進(jìn)步,但其產(chǎn)生也少不了路途中的一些磕磕絆絆。
Web 過(guò)去的好時(shí)光
在 過(guò)去,從某種意義上講,萬(wàn)維網(wǎng)(World Wide Web)就是一個(gè)電子的超級(jí)高速公路,在這里,那些敢于開(kāi)拓的公司用特異的布告牌,以當(dāng)時(shí)能夠?qū)崿F(xiàn)的最佳視覺(jué)方式展示其產(chǎn)品。人們被其吸引進(jìn)而會(huì)閱讀這些 布告牌,然后打電話給這些公司了解更多關(guān)于產(chǎn)品的信息,再通過(guò)傳統(tǒng)的方式來(lái)完成交易:電話交易或親自前往(購(gòu)買(mǎi))。
沒(méi)過(guò)多久,計(jì)算機(jī)程序員們就為發(fā)生在布告牌(其實(shí)是 Web 站點(diǎn)本身)上的買(mǎi)賣(mài)雙方的交易創(chuàng)建了一種更為交互的方式。從而,聯(lián)系我們 窗體、粗糙的購(gòu)物車(chē)及其他簡(jiǎn)單的 Web 應(yīng)用程序就誕生了。
從前,Web 站點(diǎn)只需要對(duì)超文本標(biāo)記語(yǔ)言(HTML)編碼的 Web 頁(yè)面的請(qǐng)求做出響應(yīng)?,F(xiàn)在,Web 站點(diǎn)必須記住訪客的信息,這些信息是同該訪客進(jìn)行交易所必需的。
突然間,人們不得不在登錄 Web 站點(diǎn)的時(shí)候提供這樣的信息,即是誰(shuí)、想買(mǎi)什么、想以什么方式購(gòu)買(mǎi),Web 站點(diǎn)必須維護(hù)這些信息。Web 服務(wù)器再也不能這樣簡(jiǎn)單地答復(fù)其調(diào)用者了,即向他/她發(fā)送一個(gè)頁(yè)面后就完事大吉。按照計(jì)算機(jī)界的說(shuō)法,這些任務(wù)即狀態(tài)問(wèn)題 ,這個(gè)問(wèn)題將 Web 在其幼年時(shí)期曾經(jīng)享用的那種簡(jiǎn)單的請(qǐng)求-響應(yīng)的模式復(fù)雜化了。
如 今,我們都處在這樣一個(gè)時(shí)代,每個(gè)想要讓其商業(yè)及其業(yè)務(wù)模式在 21 世紀(jì)能夠生存下來(lái)的公司都有一個(gè) Web 站點(diǎn),狀態(tài)問(wèn)題(由此變得)至關(guān)重要。如果用戶(hù) 12317 不能在線購(gòu)買(mǎi) 1437 公司的 8945 號(hào)產(chǎn)品,該用戶(hù)就能夠在從起居室的電腦旁走到廚房找些吃的東西之前,利用搜索引擎找到能夠?qū)⒃撋唐焚u(mài)給他/她的 4783 公司,換言之,一切都太方便了。
但為購(gòu)買(mǎi)產(chǎn)品的用戶(hù)簡(jiǎn)化了購(gòu)買(mǎi)過(guò)程即意味著要有其他人為這部分無(wú)形的價(jià)格買(mǎi)賬,世上沒(méi)有免費(fèi)的午餐,這是一個(gè)不言而喻的道理。Web 服務(wù)器和 Web 應(yīng)用程序是包含了許多獨(dú)立組件的復(fù)雜系統(tǒng),這些組件本身又有其復(fù)雜性:數(shù)據(jù)庫(kù)引擎、安全機(jī)制、信用卡驗(yàn)證引擎等等。
|
減輕職業(yè) IT 人的負(fù)擔(dān)
免 費(fèi)(軟件)市場(chǎng)像往常一樣出來(lái)救援了。如今的 Internet 工程師們能夠從大量工具和供應(yīng)商產(chǎn)品中挑選,這些工具和產(chǎn)品讓商業(yè)的車(chē)輪仍舊能夠向前滾動(dòng)并一路高歌。要獲取針對(duì)狀態(tài)問(wèn)題的行業(yè)水準(zhǔn)的解決方案,請(qǐng)考慮由 Apache Geronimo 為代表的 Java? 2 Platform, Enterprise Edition(J2EE?)引擎。
在典型的大型業(yè)務(wù)程序中,每個(gè)小時(shí)中,都會(huì)調(diào)用單獨(dú)的應(yīng)用程序來(lái)對(duì)成千上萬(wàn)的匿名瀏覽器發(fā)出的無(wú)休止的請(qǐng)求系列做出響應(yīng)。當(dāng)然,幾百個(gè)左右的瀏覽器自身會(huì)帶有一些服務(wù)器軟件所熟悉的信息,這些瀏覽器就是那些帶 cookie 的客戶(hù)機(jī)瀏覽器。
這 些 cookie 最初就被植入到匿名的用戶(hù) Web 瀏覽器上,從而可以確認(rèn)用戶(hù)這次是否是再次光顧 —— 辨認(rèn)出老客戶(hù)對(duì)公司來(lái)說(shuō)是件好事!客戶(hù)機(jī)狀態(tài)集就是在這里存儲(chǔ)的。Cookie 也許僅僅由一個(gè)簡(jiǎn)單的鍵值組成,該值用于解鎖存儲(chǔ)于公司數(shù)據(jù)庫(kù)中有關(guān)此用戶(hù)的大量信息。
當(dāng)一個(gè)已知客戶(hù)再次光顧且(服務(wù)器)認(rèn)出 了該用戶(hù)的瀏覽器所提供的 cookie 時(shí),狀態(tài)問(wèn)題就解決了一半。很快,服務(wù)器軟件能夠用各種有用信息定制頁(yè)面,如個(gè)人化的歡迎頁(yè)面或首選的偏好頁(yè)面。還會(huì)顯示一份與用戶(hù)過(guò)去購(gòu)買(mǎi)的產(chǎn)品相似的 產(chǎn)品清單和一些誘人的折扣,這些折扣基本上向用戶(hù)傳達(dá)了這樣的信息,即他或她是一名寶貴的客戶(hù),因而公司非常歡迎該用戶(hù)的再次光顧,希望其購(gòu)買(mǎi)更多的東 西。
|
客戶(hù)機(jī)狀態(tài)
用 Internet 工程師們的行話講,這種發(fā)生在一個(gè)經(jīng)過(guò)認(rèn)證的客戶(hù)機(jī)瀏覽器和服務(wù)器間的 Web 站點(diǎn)的對(duì)話叫做會(huì)話 。會(huì)話的狀態(tài) (已保存的關(guān)于客戶(hù)及其購(gòu)買(mǎi)習(xí)慣的信息)保存在服務(wù)器的超文本傳輸協(xié)議(HTTP)的范圍之外,因?yàn)楦鶕?jù)定義,它是一個(gè)無(wú)狀態(tài)的協(xié)議。.
|
Geronimo 中的 Java servlet 技術(shù)提供了自動(dòng)創(chuàng)建并管理會(huì)話的應(yīng)用編程接口(API)。這項(xiàng)功能的核心駐留在 HttpSession 對(duì)象中,可以通過(guò)調(diào)用請(qǐng)求對(duì)象的 getSession() 方法來(lái)訪問(wèn)會(huì)話。此方法返回與此請(qǐng)求相關(guān)聯(lián)的當(dāng)前會(huì)話;如果沒(méi)有這樣的會(huì)話,該方法會(huì)自動(dòng)創(chuàng)建一個(gè)并返回新創(chuàng)建的會(huì)話句柄。欲了解更多信息,請(qǐng)參見(jiàn)側(cè)欄中的 Geronimo 會(huì)話樣例 。
如果將 cookie 用作會(huì)話跟蹤機(jī)制(還有其他方法),servlet 代碼中的 getSession() 方法能夠修改響應(yīng)標(biāo)頭信息 —— 特別是通過(guò)自動(dòng)創(chuàng)建一個(gè)新會(huì)話(如果該請(qǐng)求尚不具備與之相關(guān)聯(lián)的會(huì)話時(shí))。諸如這樣的功能是令人叫絕的。會(huì)話以及它們可以從持久存儲(chǔ)中創(chuàng)建并回調(diào)對(duì)于那些已經(jīng)十分繁忙的程序員們來(lái)說(shuō)真是一個(gè) “救命” 的機(jī)制。
為簡(jiǎn)化并自動(dòng)化傳遞代表這個(gè) 用戶(hù)狀態(tài)的其他信息,可以用名稱(chēng)=值的方式將屬性值和會(huì)話關(guān)聯(lián)起來(lái)。如 清單 1 中的代碼片段所示。
清單 1. ShoppingCartServlet
| public class ShoppingCartServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Get session and current shopping cart information. HttpSession theSession = request.getSession(); TheShoppingCart theCart = (TheShoppingCart) session.getAttribute(thecart); . . . // Calculate the total price of all items in the cart. double totalPrice = theCart.getTotal(); |
大量的處理都在其幕后進(jìn)行,這些處理居于 Geronimo 的核心來(lái)維護(hù)之前所描述過(guò)的狀態(tài)問(wèn)題,并且 Java servlet 機(jī)制會(huì)掩藏這些細(xì)節(jié)。信息存儲(chǔ)于請(qǐng)求之間,所以總能知道一個(gè)給定用戶(hù)和公司的(交易)歷史記錄。
實(shí)現(xiàn)維護(hù)客戶(hù)機(jī)瀏覽器狀態(tài)的 HttpSession 方法的應(yīng)用程序也具有和其使用相關(guān)聯(lián)的重要的附加功能。在這些附加的功能中,其中一種功能是能夠用來(lái)自動(dòng)通知會(huì)話關(guān)系中其他對(duì)象的。例如,如果一些對(duì)象實(shí)現(xiàn)了 javax.http.HttpSessionBindingListener 接口,那么它們就可以被告知它們已經(jīng)被添加到一個(gè)會(huì)話中或已經(jīng)從一個(gè)會(huì)話中刪除。
如果與對(duì)象相關(guān)聯(lián)的會(huì)話是被動(dòng)的或主動(dòng)的,如在虛擬機(jī)(VM)間或持久性存儲(chǔ)間移動(dòng),當(dāng)該對(duì)象實(shí)現(xiàn)了 javax.http.HttpSessionActivationListener 接口時(shí),就能夠向該對(duì)象通知這項(xiàng)改變。
像這樣的事件通知讓對(duì)象能夠在特定的時(shí)間完成與正在發(fā)生事件密切相關(guān)的事情,如將會(huì)話已經(jīng)發(fā)生這一事實(shí)記入日志,這將導(dǎo)致會(huì)記錄下更多的用戶(hù)購(gòu)物習(xí)慣。可以用這種方式觸發(fā)各種各樣的高級(jí)數(shù)據(jù)挖掘規(guī)則。
|
服務(wù)器狀態(tài)
服 務(wù)器上進(jìn)行的會(huì)話管理包括許多任務(wù),這些任務(wù)也許在直觀上并不明顯。但每個(gè)會(huì)話都消耗服務(wù)器資源(特別是內(nèi)存),這些資源必須在會(huì)話超時(shí)時(shí)收回。會(huì)話的超 時(shí)值依賴(lài)于許多因素,對(duì)這些因素的詳細(xì)介紹超出了本文討論的范圍,可以用應(yīng)用程序的部署工具來(lái)設(shè)定該值?;蛘?#xff0c;會(huì)話對(duì)象本身可以通過(guò)調(diào)用 getMaxInactiveInterval() 或 setMaxInactiveInterval() 方法來(lái)獲取或設(shè)定該超時(shí)值。
每個(gè)會(huì)話都有一個(gè)與其相關(guān)聯(lián)的生存時(shí)間計(jì)數(shù)器,一個(gè)比較好的做法是定時(shí)地使用服務(wù)方法來(lái)訪問(wèn)該會(huì)話,因?yàn)檫@樣做會(huì)重置計(jì)數(shù)器且會(huì)阻止會(huì)話的超時(shí)(實(shí)例化及終止會(huì)話會(huì)消耗大量的 CPU 和內(nèi)存資源,因而最好是在合理的時(shí)間內(nèi)保持會(huì)話的活動(dòng))。
這就是為什么要向用戶(hù)顯示 Sign out 或 Log off 這類(lèi)的按鈕并鼓勵(lì)用戶(hù)去使用這些按鈕的原因之一。當(dāng)用戶(hù)單擊該按鈕時(shí),實(shí)質(zhì)上告知服務(wù)器該會(huì)話已經(jīng)結(jié)束,隨后會(huì)調(diào)用該會(huì)話的 invalidate() 方法來(lái)清理服務(wù)器上該會(huì)話的數(shù)據(jù)并收回前面提到的資源。清單 2 中的代碼說(shuō)明了這一過(guò)程。
清單 2. FinishServlet
| public class FinishServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Get session and shopping cart information and end the session. HttpSession theSession = request.getSession(); theSession.invalidate(); |
|
跟蹤難以捉摸的客戶(hù)
如 前所述,有幾種可用的方法將會(huì)話信息和特定的用戶(hù)關(guān)聯(lián)起來(lái),所有這些方法都要求在客戶(hù)機(jī)和服務(wù)器計(jì)算機(jī)間傳遞一定種類(lèi)的標(biāo)識(shí)符。已經(jīng)提到的一種方法是 cookie 方法。另一種方法是將該標(biāo)識(shí)符包含到每一個(gè)后來(lái)發(fā)送回客戶(hù)機(jī)瀏覽器的 URL 中。這個(gè)標(biāo)識(shí)符(通常是數(shù)據(jù)庫(kù)鍵)能夠作為該 URL 參數(shù)之一而生成并發(fā)送到客戶(hù)機(jī)。很肯定地說(shuō),如果您看到和下列相似的 URL 時(shí),就說(shuō)明您正在被跟蹤:http://www.somedomain.com/applications/thecart?jsessionid= 868D6879824E0F3FB499D8146A9EE7F
這個(gè)叫做 jsessionid 的十六進(jìn)制數(shù)字是到 Geronimo 會(huì)話句柄的主鍵,并為系統(tǒng)提供了關(guān)于您的信息(您在過(guò)去某時(shí)提供的)。這是一個(gè)會(huì)話編號(hào)(準(zhǔn)備好再現(xiàn)關(guān)于您的數(shù)據(jù)),它存儲(chǔ)在之前對(duì) Web 站點(diǎn)訪問(wèn)的持久性存儲(chǔ)中。使用該方法維護(hù)狀態(tài)有諸多優(yōu)勢(shì),最顯著的是它并不依賴(lài)用戶(hù)瀏覽器 cookie 機(jī)制的打開(kāi)(正如時(shí)下許多人所做的)。
Web 應(yīng)用程序必須重寫(xiě)每一個(gè)在 Web 頁(yè)面中發(fā)送給用戶(hù)的 URL,否則將丟失該會(huì)話信息。如果用 J2EE 的方式(因而也是 Geronimo 方式)來(lái)實(shí)現(xiàn),就要對(duì)所有由 servlet 返回的 URL 調(diào)用響應(yīng)對(duì)象的 encodeURL() 方法。這樣,只有當(dāng)用戶(hù)瀏覽器關(guān)閉了 cookie 處理,生成的 URL 中才會(huì)包含會(huì)話 ID。否則,瀏覽器返回未改變的 URL,例如:
out.println(" response.encodeURL(request.getContextPath() +"/thecart") + "">Continue Shopping?");
如果用戶(hù)關(guān)閉了瀏覽器中的 cookie,將看到與此類(lèi)似的(顯示):http://www.somedomain.com/applications/thecart?jsessionid=868D6879824E0F3FB499D8146A9EE7F 。
但如果 cookie 機(jī)制仍打開(kāi)著,將看到與此類(lèi)似的(顯示):http://www.somedomain.com/applications/thecart 。
|
結(jié)束語(yǔ)
通 過(guò)使用頂級(jí)的工具,如 Geronimo 及其所實(shí)現(xiàn)的 J2EE 技術(shù),現(xiàn)代 Web 應(yīng)用程序所必須維護(hù)的許多狀態(tài)問(wèn)題都可以得到極大的簡(jiǎn)化。如果您是一個(gè)珍惜自己睡眠時(shí)間的公司經(jīng)理,那么您盡可以高枕無(wú)憂,因?yàn)?Geronimo 架構(gòu)可以為您的客戶(hù)提供愉快的體驗(yàn)以使其在下次光顧時(shí)仍能保持愉悅;該架構(gòu)還可以讓您的程序員們也非常滿意,因?yàn)樗梢詾槌绦騿T們提供一個(gè)可靠的環(huán)境以使 維護(hù)用戶(hù)狀態(tài)變得十分簡(jiǎn)單。
來(lái)自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/374079/viewspace-130302/,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任。
轉(zhuǎn)載于:http://blog.itpub.net/374079/viewspace-130302/
總結(jié)
以上是生活随笔為你收集整理的[转载]三、二、一 …… Geronimo!,第 3 部分: 状态问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WASCE (基于geronimo )
- 下一篇: 如何用java获取网页源代码