專利名稱:有狀態(tài)程序?qū)嶓w的工作負(fù)荷管理的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及維護(hù)易失性存儲(chǔ)器中的狀態(tài)的程序?qū)嶓w的工作負(fù)荷管理,具體來說,涉及諸如Enterprise JavaBeansTM體系結(jié)構(gòu)的有狀態(tài)會(huì)話bean之類的對象的重新定位。
背景技術(shù):
在客戶端-服務(wù)器企業(yè)系統(tǒng)中進(jìn)行工作負(fù)荷管理現(xiàn)在是普遍現(xiàn)象。在工作負(fù)荷管理系統(tǒng)中,設(shè)置一組服務(wù)器進(jìn)程(工作組),以便工作組中的每一個(gè)服務(wù)器進(jìn)程都具有類似的能力。這使得工作組中的每個(gè)服務(wù)器進(jìn)程都代表客戶端處理給定的請求(或消息)。當(dāng)客戶端向工作組發(fā)送請求時(shí),工作負(fù)荷管理單元決定將請求分配給工作組中的哪一個(gè)服務(wù)器進(jìn)程。這通?;谟脩舳x的策略,這種策略可以是,最不忙或循環(huán)復(fù)用。這樣就有希望確保,有效地使用服務(wù)器進(jìn)程資源,客戶端由于單服務(wù)器進(jìn)程同時(shí)為許多客戶端運(yùn)行請求所引起的瓶頸而造成的響應(yīng)速度較慢的可能性較小。
圖1顯示了一個(gè)典型的工作負(fù)荷管理系統(tǒng)。該系統(tǒng)包括許多客戶端通過網(wǎng)絡(luò)(11)與工作負(fù)荷管理單元(12)進(jìn)行通信的許多客戶端(10)。工作負(fù)荷管理單元(12)通過網(wǎng)絡(luò)(11)向包括兩個(gè)服務(wù)器進(jìn)程的工作組分配工作,每一服務(wù)器進(jìn)程都在服務(wù)器(13和14)中運(yùn)行。當(dāng)客戶端發(fā)出請求時(shí),工作負(fù)荷管理單元接收該請求,并選擇服務(wù)器進(jìn)程,以便將請求分配給該服務(wù)器進(jìn)程。工作負(fù)荷管理單元可以是組成工作組的一個(gè)或多個(gè)服務(wù)器進(jìn)程的一部分。
在理想的情況下,在這樣的系統(tǒng)中,工作負(fù)荷管理單元基于所選擇的策略為接收到的每一個(gè)客戶端請求隨意選擇服務(wù)器進(jìn)程,因?yàn)?,這樣能夠更好地分配工作。然而,這并不總是可以實(shí)現(xiàn)的。例如,在一個(gè)請求中,客戶端可以在一個(gè)給定服務(wù)器進(jìn)程中創(chuàng)建一個(gè)對象實(shí)例,而該服務(wù)器進(jìn)程包含客戶端在隨后的請求中需要訪問的數(shù)據(jù)。為使客戶端正確地工作,工作負(fù)荷分配單元必須確??蛻舳丝梢栽L問正確的對象實(shí)例。這可以這樣來實(shí)現(xiàn),通過在客戶端的壽命內(nèi)維護(hù)客戶端-服務(wù)器關(guān)系的某些元素,以確保,當(dāng)客戶端以后需要訪問在其中創(chuàng)建了對象實(shí)例的服務(wù)器進(jìn)程時(shí),客戶端能夠返回到該服務(wù)器進(jìn)程,或者通過使對象實(shí)例能在響應(yīng)不同請求時(shí)在各個(gè)服務(wù)器進(jìn)程之間移動(dòng),而不會(huì)改變狀態(tài)。如果唯一可用的選項(xiàng)是客戶端-服務(wù)器關(guān)系,那么,工作負(fù)荷分配將受到不利的影響,因?yàn)槲ㄒ豢梢宰龅降氖菍蛻舳苏埱蟮淖蛹M(jìn)行工作負(fù)荷管理,如果說預(yù)測當(dāng)客戶端-服務(wù)器關(guān)系被固定時(shí)客戶端施加于服務(wù)器進(jìn)程的負(fù)荷不是不可能的話,也是比較困難的。
因此,優(yōu)選情況下,最好能使對象在請求之間移動(dòng)服務(wù)器進(jìn)程。對于維護(hù)數(shù)據(jù)庫(或文件)中的狀態(tài)數(shù)據(jù)的對象是相當(dāng)簡單的,因?yàn)閷ο髮?shí)例可以從工作組中的任何服務(wù)器進(jìn)程訪問數(shù)據(jù)庫或文件。結(jié)果,對象實(shí)例可以移到任何服務(wù)器進(jìn)程中,雖然如果它參與事務(wù),則在事務(wù)完成之前對象無法移動(dòng),因?yàn)樵谑聞?wù)期間進(jìn)行的數(shù)據(jù)庫更改只有在事務(wù)提交之后才被加固到數(shù)據(jù)庫。然而,如果對象實(shí)例保留易失性存儲(chǔ)器中的狀態(tài)數(shù)據(jù),則它無法輕易地在服務(wù)器進(jìn)程之間移動(dòng)。這是因?yàn)?,易失性存?chǔ)器通常只能從分配它的服務(wù)器進(jìn)程進(jìn)行訪問。結(jié)果,如果客戶端使用這種類型的對象,則實(shí)施客戶端-服務(wù)器關(guān)系,工作負(fù)荷管理將受到所討論的限制。
這可以通過查看在這樣的工作負(fù)荷管理客戶端-服務(wù)器企業(yè)系統(tǒng)中使用的特定的編程模式來進(jìn)行說明。一個(gè)好的示例是行業(yè)標(biāo)準(zhǔn)Enterprise JavaBeansTM(EJBTM)編程模式。此模式在SunMicrosystems,Inc.推出的Enterprise JavaBeans v1.1規(guī)范中進(jìn)行了全面的定義,該規(guī)范在這里進(jìn)行了引用。為清楚起見,現(xiàn)在描述此規(guī)范的某些特點(diǎn)。
Enterprise JavaBeans v1.1規(guī)范基于EJB對象的功能描述了在服務(wù)器進(jìn)程中運(yùn)行的EJB(對象)的分類。兩個(gè)類別是會(huì)話bean和實(shí)體bean。會(huì)話bean通常代表客戶端執(zhí)行;可以訪問數(shù)據(jù)庫但不代表數(shù)據(jù)庫;壽命短;不可恢復(fù)。實(shí)體bean通常對多個(gè)客戶端可訪問;代表數(shù)據(jù)庫;壽命長;可恢復(fù)。會(huì)話bean進(jìn)一步可以分類為無狀態(tài)的或有狀態(tài)。無狀態(tài)會(huì)話bean實(shí)例不包含會(huì)話狀態(tài),以便客戶端可以使用會(huì)話bean的任何實(shí)例。然而,有狀態(tài)會(huì)話bean實(shí)例卻包含客戶端可能需要重復(fù)訪問的會(huì)話狀態(tài)。結(jié)果,客戶端必須始終訪問具有所需的狀態(tài)的有狀態(tài)會(huì)話bean的實(shí)例。由于此狀態(tài)至少部分地保留在易失性存儲(chǔ)器中,這通常需要客戶端始終訪問有狀態(tài)會(huì)話bean的同一實(shí)例。
EJB容器為EJB在服務(wù)器進(jìn)程中提供了一個(gè)執(zhí)行環(huán)境。Enterprise JavaBeans v1.1規(guī)范指定了客戶端和容器以及EJB和其容器之間的合同。容器和客戶端之間的合同的一部分是為EJB提供一個(gè)宿主,客戶端可以進(jìn)入到其中,以創(chuàng)建新的EJB實(shí)例并定位現(xiàn)有的EJB實(shí)例。EJB和其容器之間的合同的一部分指定了EJB必須實(shí)現(xiàn)的方法,以便使容器能夠給bean實(shí)例提供對容器服務(wù)的訪問,并向bean實(shí)例發(fā)出通知。這些方法隨著bean的類型而變化。例如,有狀態(tài)會(huì)話bean必須實(shí)現(xiàn)的兩個(gè)方法是ejbActivate()和ejbPassivate()。當(dāng)容器即將通過序列化bean實(shí)例并將它寫入到磁盤中來鈍化bean實(shí)例時(shí),在bean實(shí)例上調(diào)用ejbPassivate()。這可以由于種種原因來進(jìn)行,如,bean在其中被實(shí)例化的服務(wù)器進(jìn)程的內(nèi)存容量低和/或bean實(shí)例在指定的時(shí)間段內(nèi)沒有被訪問。然而,由于會(huì)話bean可以被事務(wù)識(shí)別,當(dāng)bean實(shí)例參與事務(wù)時(shí),容器無法鈍化bean實(shí)例。在ejbPassivate()方法中,bean實(shí)例必須確保,至少部分地保留在內(nèi)存中的其會(huì)話狀態(tài),可以不被鈍化,因此,例如,它必須關(guān)閉它打開的任何JDBCTM連接。一旦bean實(shí)例被鈍化,可以通過從磁盤中讀取其序列化的形式,解除其序列化,然后調(diào)用其ejbActivate()方法來重新活化。結(jié)果,在ejbActivate()方法中,bean實(shí)例可以重新打開任何在鈍化期間被關(guān)閉的JDBC連接。
圖2是所描述的EJB編程模式的略圖。它顯示了提供EJB容器(201)的EJB服務(wù)器進(jìn)程(20)。對于每一個(gè)實(shí)現(xiàn)的EJB,提供了EJB宿主(202),該宿主可以被客戶端(10)用來創(chuàng)建該EJB(203)的實(shí)例。EJB服務(wù)器進(jìn)程(20)可以為許多EJB實(shí)現(xiàn)提供宿主。EJB實(shí)例(203)在EJB容器(201)提供的環(huán)境中執(zhí)行,一旦創(chuàng)建實(shí)例,客戶端(10)就可以向它發(fā)送請求。隨時(shí)都可能有相同或不同的客戶端創(chuàng)建的EJB的許多實(shí)例(204,205)。
圖3a和3b是有狀態(tài)會(huì)話bean鈍化和重新活化的略圖。圖3a顯示了在易失性存儲(chǔ)器中維護(hù)bean的計(jì)數(shù)器的名為BeanCounter的有狀態(tài)會(huì)話bean的實(shí)例。在鈍化期間,Deancounter實(shí)例(302)從EJBServer(20)中的易失性存儲(chǔ)器中刪除,并以其序列化的形式(304)寫入到磁盤上的bean存儲(chǔ)區(qū)中(303)。序列化的形式包含BeanCounter實(shí)例(302)的會(huì)話狀態(tài)(beans=5)。BeanCounter實(shí)例(302)是以虛線繪制的,以表示,它已經(jīng)從易失性存儲(chǔ)器中刪除,并且在結(jié)束鈍化時(shí),它只以其序列化形式(304)存在于磁盤之中。圖3b顯示了重新活化,這是鈍化的相反過程。從磁盤中讀取bean實(shí)例(304)的序列化形式,并作為Beancounter實(shí)例(302)重新活化。在重新活化之后,實(shí)例存在于易失性存儲(chǔ)器中,并包含在鈍化之前它包含的會(huì)話狀態(tài)(beans=5)。在此過程之后,bean實(shí)例(304)的序列化形式可以也可以不必存在于磁盤中。
現(xiàn)在可以看出,在使用EJB編程模式的工作負(fù)荷管理系統(tǒng)中,工作負(fù)荷管理單元必須對客戶端以前訪問的EJB的類型敏感。例如,如果客戶端只訪問無狀態(tài)會(huì)話bean實(shí)例,那么,來自客戶端的任何請求都可以由工作負(fù)荷管理單元基于所選擇的分配策略,分配給工作組中的任何服務(wù)器進(jìn)程。這是因?yàn)?,這些bean不包含會(huì)話狀態(tài)。如果客戶端訪問實(shí)體bean實(shí)例,則它們還可以移動(dòng)服務(wù)器進(jìn)程,但只能在事務(wù)之間進(jìn)行,因?yàn)閷?shí)體bean在數(shù)據(jù)庫保持狀態(tài)并且是事務(wù)性的。然而,如果客戶端創(chuàng)建并訪問有狀態(tài)會(huì)話bean實(shí)例,由于實(shí)例可以在易失性存儲(chǔ)器中包含會(huì)話狀態(tài),客戶端在客戶端的壽命內(nèi)將保持與在其中創(chuàng)建bean的服務(wù)器進(jìn)程的關(guān)系,以便來自客戶端的所有隨后的發(fā)往bean實(shí)例的請求都被給予相同的服務(wù)器進(jìn)程。如果bean在請求之間被鈍化,則當(dāng)接收到鈍化之后的第一個(gè)請求時(shí),bean在服務(wù)器進(jìn)程中被重新活化。
提供使用EJB編程模式的工作負(fù)荷管理系統(tǒng)的產(chǎn)品的一個(gè)示例是BEA Systems,Inc.的BEA Weblogic ServerTM6.0產(chǎn)品。該產(chǎn)品將工作組叫做服務(wù)器群集。以兩種形式提供工作負(fù)荷管理。EJB宿主對象可以具有識(shí)別群集的宿主存根,該存根了解群集中的所有服務(wù)器進(jìn)程上的所有EJBHome對象。此存根為客戶端請求提供工作負(fù)荷平衡,以創(chuàng)建和查找EJB實(shí)例。EJB可以具有識(shí)別副本的EJBObject存根,該存根了解駐留在群集中的服務(wù)器進(jìn)程的EJB的所有副本。EJBObject存根為EJB方法調(diào)用提供負(fù)載平衡和故障轉(zhuǎn)移服務(wù)。無狀態(tài)會(huì)話bean可以是識(shí)別副本的,并具有識(shí)別群集的宿主,以便創(chuàng)建和訪問無狀態(tài)會(huì)話的所有請求的工作負(fù)荷都可以得到管理。然而,有狀態(tài)會(huì)話bean只能具有識(shí)別群集的宿主,因此只有創(chuàng)建有狀態(tài)會(huì)話bean的調(diào)用的工作負(fù)荷才可以得到管理。到有狀態(tài)會(huì)話bean實(shí)例的所有請求一般來說被給予相同的服務(wù)器進(jìn)程。使用有狀態(tài)會(huì)話bean實(shí)例的內(nèi)存中的復(fù)制提供了這一情況的例外。對于內(nèi)存中的復(fù)制,有狀態(tài)會(huì)話bean被給予削減識(shí)別副本的對象存根,該存根bean實(shí)例維護(hù)了在上面運(yùn)行的主服務(wù)器進(jìn)程實(shí)例,以及一個(gè)輔助服務(wù)器進(jìn)程實(shí)例,以便用于復(fù)制bean的狀態(tài)?,F(xiàn)在如果客戶端在事務(wù)的范圍內(nèi)修改bean實(shí)例的狀態(tài),當(dāng)事務(wù)被提交時(shí),bean實(shí)例的狀態(tài)在輔助服務(wù)器進(jìn)程中的易失性存儲(chǔ)器中復(fù)制。萬一bean實(shí)例的主服務(wù)器進(jìn)程發(fā)生故障,則客戶端請求被重新路由到輔助服務(wù)器進(jìn)程,該輔助服務(wù)器進(jìn)程變成主服務(wù)器進(jìn)程,并從群集中分配一個(gè)新的輔助服務(wù)器進(jìn)程。在此情況下,客戶端自動(dòng)獲得對bean的最后一個(gè)提交的狀態(tài)的訪問。這為有狀態(tài)會(huì)話bean提供了故障轉(zhuǎn)移支持而不是工作負(fù)荷管理,并需要服務(wù)器協(xié)調(diào)bean實(shí)例的內(nèi)存中的副本的刪除。還可以看出,如果有狀態(tài)會(huì)話EJB實(shí)例在未完成的事務(wù)中被修改,當(dāng)主服務(wù)器發(fā)生故障時(shí),到EJB實(shí)例的下一個(gè)請求將不會(huì)失敗,但會(huì)丟失未提交的更改。結(jié)果,客戶端永遠(yuǎn)不會(huì)知道有狀態(tài)會(huì)話bean實(shí)例是否丟失未提交的更新。
發(fā)明內(nèi)容
因此,需要提供用于包含易失性存儲(chǔ)器中保留的狀態(tài)數(shù)據(jù)的程序?qū)嶓w的工作負(fù)荷管理。
根據(jù)第一個(gè)方面,本發(fā)明提供了一種用于在數(shù)據(jù)處理系統(tǒng)上運(yùn)行的數(shù)據(jù)處理方法,所說的數(shù)據(jù)處理系統(tǒng)具有非易失性存儲(chǔ)器存儲(chǔ)設(shè)備,該方法包括下列步驟作為服務(wù)器進(jìn)程的一部分,通過將程序?qū)嶓w的實(shí)例寫入到所說的存儲(chǔ)設(shè)備上的程序?qū)嶓w存儲(chǔ)區(qū),并從所說的服務(wù)器進(jìn)程中將其刪除,來鈍化所說的程序?qū)嶓w的實(shí)例;作為服務(wù)器進(jìn)程的一部分,通過從所說的程序?qū)嶓w存儲(chǔ)區(qū)讀取所說的程序?qū)嶓w的實(shí)例,并在所說的服務(wù)器進(jìn)程中重新創(chuàng)建它,來重新活化所說的程序?qū)嶓w的實(shí)例;其中,鈍化以及隨后重新活化所說的特定程序?qū)嶓w實(shí)例的服務(wù)器進(jìn)程是不同的,其特征還在于根據(jù)工作負(fù)荷分配算法選擇在其中重新活化特定程序?qū)嶓w實(shí)例的服務(wù)器進(jìn)程。
根據(jù)第二個(gè)方面,本發(fā)明提供了一種用于執(zhí)行上文描述的數(shù)據(jù)處理方法的計(jì)算機(jī)程序產(chǎn)品。
根據(jù)第三個(gè)方面,本發(fā)明提供了一種數(shù)據(jù)處理系統(tǒng),包括至少一個(gè)服務(wù)器;許多能夠在所說的至少一個(gè)服務(wù)器上運(yùn)行的服務(wù)器進(jìn)程,其中每個(gè)服務(wù)器進(jìn)程都支持程序?qū)嶓w;以及每一個(gè)服務(wù)器進(jìn)程都可以訪問到的非易失性存儲(chǔ)器存儲(chǔ)設(shè)備;其中每一個(gè)服務(wù)器進(jìn)程都包括用于通過將所說的程序?qū)嶓w的實(shí)例寫入到所說的存儲(chǔ)設(shè)備上的程序?qū)嶓w存儲(chǔ)區(qū)來鈍化所說的程序?qū)嶓w的實(shí)例的裝置;以及用于通過從所說的程序?qū)嶓w存儲(chǔ)區(qū)讀取所說的程序?qū)嶓w的實(shí)例,并使用它來重新創(chuàng)建所說的程序?qū)嶓w實(shí)例,來重新活化所說的程序?qū)嶓w的實(shí)例的裝置;其中,重新活化的裝置可以重新活化被不同的服務(wù)器進(jìn)程的鈍化裝置鈍化的程序?qū)嶓w實(shí)例,其特征還在于,用于根據(jù)工作負(fù)荷分配算法選擇在其中重新活化所說的特定程序?qū)嶓w實(shí)例的服務(wù)器進(jìn)程的裝置。
如此,本發(fā)明能使維護(hù)易失性存儲(chǔ)器中的狀態(tài)數(shù)據(jù)的程序?qū)嶓w的實(shí)例通過在一個(gè)服務(wù)器進(jìn)程中鈍化并在第二個(gè)服務(wù)器進(jìn)程中重新活化來在服務(wù)器進(jìn)程之間移動(dòng)。結(jié)果,如果實(shí)體在請求之間移動(dòng)服務(wù)器進(jìn)程,則訪問程序?qū)嶓w實(shí)例的請求可以受到工作負(fù)荷管理,由工作負(fù)荷管理單元選擇它所移向的服務(wù)器進(jìn)程。由于鈍化步驟將程序?qū)嶓w實(shí)例的序列化形式寫入到磁盤,而重新活化步驟在重新創(chuàng)建程序?qū)嶓w實(shí)例時(shí)解除序列化形式的序列化,因此,程序?qū)嶓w的狀態(tài)數(shù)據(jù)得到維護(hù)。
優(yōu)選情況下,為其提供工作負(fù)荷管理支持的程序?qū)嶓w是Enterprise JavaBean規(guī)范的有狀態(tài)會(huì)話bean的實(shí)例。結(jié)果,如Enterprise JavaBeans所描述的,鈍化和重新活化涉及ejbPassivate()和ejbActivate()。或者,程序?qū)嶓w也可以是Java bean或C++對象的實(shí)例。
優(yōu)選情況下,本發(fā)明進(jìn)一步為涉及程序?qū)嶓w實(shí)例的工作單元提供了工作負(fù)荷管理。工作單元將諸如請求之類的一個(gè)或多個(gè)事件分隔為單個(gè)的單元。優(yōu)選情況下,工作單元是CORBA對象事項(xiàng)服務(wù)事務(wù)。或者,工作單元可以是,不同類型的事務(wù),會(huì)話、業(yè)務(wù)方法、IBM CICS工作單元或客戶端請求。另一種類型的事務(wù)的示例是Java事務(wù)API事務(wù)。這是通過在所選的工作單元完成時(shí),而不是在此期間鈍化程序?qū)嶓w來實(shí)現(xiàn)的。
優(yōu)選情況下,本發(fā)明進(jìn)一步向客戶端提供保證,在諸如事務(wù)之類的一個(gè)工作單元下訪問的程序?qū)嶓w實(shí)例,在工作單元完成之前,無法超出工作單元的范圍之外重新訪問。結(jié)果,如果工作單元由于在其中執(zhí)行的服務(wù)器進(jìn)程發(fā)生故障而不能完成,則程序?qū)嶓w實(shí)例將停止存在。這可以通過確保程序?qū)嶓w實(shí)例在重新活化期間從程序?qū)嶓w存儲(chǔ)區(qū)刪除來實(shí)現(xiàn)。
優(yōu)選情況下,提供了包含可用于定位程序?qū)嶓w實(shí)例的信息的路由表。程序?qū)嶓w實(shí)例在為程序?qū)嶓w提供支持的許多服務(wù)器進(jìn)程中的任何一個(gè)服務(wù)器進(jìn)程中是活化的,或者,在不同的時(shí)間在bean存儲(chǔ)區(qū)中是鈍化的。然后可以在收到訪問程序?qū)嶓w實(shí)例的請求之時(shí)使用路由表,將請求定向到程序?qū)嶓w當(dāng)前在其中是活化的的服務(wù)器進(jìn)程中,或如果程序?qū)嶓w當(dāng)前是鈍化的,則定向到任何服務(wù)器。程序?qū)嶓w存在于程序?qū)嶓w存儲(chǔ)區(qū)中可以由路由表中沒有與程序?qū)嶓w相關(guān)的項(xiàng)來表示。
優(yōu)選情況下,減少對路由表的訪問。如果與程序?qū)嶓w實(shí)例關(guān)聯(lián)并用于將程序?qū)嶓w標(biāo)識(shí)為請求的目標(biāo)的鍵包括一個(gè)標(biāo)志,表示程序?qū)嶓w實(shí)例的位置信息在路由表中存在,就可以實(shí)現(xiàn)這一點(diǎn)。然后,在收到入站請求之時(shí),可以使用這一標(biāo)志決定是否在路由表中查找bean實(shí)例的位置。例如,與有狀態(tài)會(huì)話bean實(shí)例關(guān)聯(lián)的鍵可以包括表示bean實(shí)例參與到不完整的bean管理事務(wù)中的標(biāo)志。這可能是路由表將包括bean實(shí)例的位置信息的唯一情況,因此,當(dāng)接收到一個(gè)bean實(shí)例請求時(shí),只需要搜索路由表,查看其中bean實(shí)例是否設(shè)置了bean管理的標(biāo)志。
下面將參考下面的附圖,對本發(fā)明的優(yōu)選實(shí)施例進(jìn)行描述圖1是優(yōu)選情況下應(yīng)用了本發(fā)明的優(yōu)選實(shí)施例的數(shù)據(jù)處理環(huán)境的方框圖;圖2是與本發(fā)明有關(guān)并在優(yōu)選情況下應(yīng)用了本發(fā)明的Enterprise JavaBeans功能的略圖;圖3a和3b分別是根據(jù)Enterprise JavaBean規(guī)范的有狀態(tài)會(huì)話bean鈍化和重新活化的略圖;圖4a和4b是本發(fā)明的優(yōu)選實(shí)施例中的主要部件之間涉及的流程的順序圖;圖5是本發(fā)明的優(yōu)選實(shí)施例的略圖;圖6是根據(jù)本發(fā)明的優(yōu)選實(shí)施例的在磁盤上保存的能進(jìn)行有狀態(tài)會(huì)話bean的工作負(fù)荷管理的信息類型的說明圖;以及圖7是根據(jù)本發(fā)明的優(yōu)選實(shí)施例的當(dāng)向服務(wù)器分配入站請求時(shí)工作負(fù)荷管理單元所遵循的邏輯的流程圖。
具體實(shí)施例方式
圖1顯示了優(yōu)選情況下應(yīng)用了本發(fā)明的優(yōu)選實(shí)施例的數(shù)據(jù)處理環(huán)境。在該圖中,客戶端數(shù)據(jù)處理設(shè)備(10)通過網(wǎng)絡(luò)(11)連接到工作負(fù)荷管理單元設(shè)備(12),網(wǎng)絡(luò)可以是因特網(wǎng)??蛻舳讼蚬ぷ髫?fù)荷管理單元設(shè)備(12)發(fā)送請求(或消息),工作負(fù)荷管理單元設(shè)備(12)通過網(wǎng)絡(luò)(11)向數(shù)據(jù)處理服務(wù)器Server1(13)和Server2(14)分配請求,其中每一個(gè)服務(wù)器都包括處理這些請求的服務(wù)器進(jìn)程。Server2(13)和Server2(14)的服務(wù)器進(jìn)程能夠處理等效的請求并構(gòu)成一個(gè)工作組。雖然在此實(shí)施例中工作組包括兩個(gè)服務(wù)器進(jìn)程,每一個(gè)服務(wù)器進(jìn)程都來自不同的數(shù)據(jù)處理服務(wù)器,但是,在其他實(shí)施例中,數(shù)據(jù)處理服務(wù)器可以包括一個(gè)或多個(gè)服務(wù)器進(jìn)程,工作組可以包括來自一個(gè)或多個(gè)數(shù)據(jù)處理服務(wù)器的兩個(gè)或更多服務(wù)器進(jìn)程。
Server1(13)具有用于控制服務(wù)器的操作的處理器(131),用于臨時(shí)存儲(chǔ)諸如有狀態(tài)會(huì)話bean的存儲(chǔ)器中的實(shí)例之類的數(shù)據(jù)的易失性存儲(chǔ)器元件(132),用于存儲(chǔ)諸如鈍化有狀態(tài)會(huì)話bean的序列化形式之類的數(shù)據(jù)的非易失性存儲(chǔ)器(133),以及用于與網(wǎng)絡(luò)(11)進(jìn)行連接的網(wǎng)絡(luò)連接器(134)。雖然未顯示,但是,客戶端(10)、工作負(fù)荷管理單元(12)和Server2(14)由與Server1的相同組件(131、132、133、134)構(gòu)成,至少一個(gè)服務(wù)器的非易失性存儲(chǔ)器(133)必須能夠被工作組中的其他服務(wù)器訪問。值得注意的是,在優(yōu)選實(shí)施例中,雖然工作組由兩臺(tái)服務(wù)器組成,但是,在其他實(shí)施例中,工作組可以由兩臺(tái)以上的服務(wù)器構(gòu)成。也是在優(yōu)選實(shí)施例中,與構(gòu)成工作組的服務(wù)器(13和14)分開顯示了客戶端(10)和工作負(fù)荷管理單元(12),但是,在其他實(shí)施例中,這些設(shè)備中的一個(gè)或多個(gè)也可以是工作組中的服務(wù)器。此外,在優(yōu)選實(shí)施例中,Server1(13)包括單個(gè)組件(131、132、133、134),但是,在其他實(shí)施例中,可以有這些元件中的一個(gè)或多個(gè),相反,工作組中的一個(gè)或多個(gè)服務(wù)器也可以共享這些組件。
在優(yōu)選實(shí)施例中工作組提供了Enterprise JavaBeans編程模式的支持,同樣也提供了有狀態(tài)會(huì)話bean的支持;提供的事務(wù)服務(wù)是與CORBA兼容的對象事務(wù)服務(wù)(OTS);工作負(fù)荷管理單元提供了事務(wù)關(guān)系的支持,以便在一個(gè)給定事務(wù)下的所有請求都由工作組中的相同的服務(wù)器進(jìn)程進(jìn)行處理。
圖4a和4b顯示了,根據(jù)本發(fā)明的優(yōu)選實(shí)施例,可以從在兩個(gè)單獨(dú)的客戶端啟動(dòng)的事務(wù)的范圍內(nèi)創(chuàng)建并訪問一個(gè)給定有狀態(tài)會(huì)話的bean的客戶端產(chǎn)生的流程的序列。然而,請注意,所顯示的流程只是將實(shí)際發(fā)生的與優(yōu)選實(shí)施例有關(guān)的流程的子集。在此示例中,給定有狀態(tài)會(huì)話bean是BeanCounter bean,該bean可以由客戶端用來在客戶端的壽命內(nèi)統(tǒng)計(jì)bean。雖然這好像是一個(gè)有點(diǎn)過分簡單的有狀態(tài)會(huì)話bean,但是,bean統(tǒng)計(jì)確實(shí)具有保留在內(nèi)存中的會(huì)話狀態(tài),完全可以適合用于此描述。然而,值得注意的是,本發(fā)明同樣可以應(yīng)用于在實(shí)踐中可能比較復(fù)雜并也可以訪問數(shù)據(jù)庫中的數(shù)據(jù)的任何給定的有狀態(tài)會(huì)話bean實(shí)例。
圖4a顯示了客戶端的第一個(gè)事務(wù)的處理過程。客戶端(401)發(fā)出開始事務(wù)請求(403),工作負(fù)荷管理單元(未顯示)將該請求分配給EJBServer1(402)中的事務(wù)服務(wù),并建立事務(wù)與此服務(wù)器進(jìn)程的關(guān)系。在事務(wù)被啟動(dòng)之后,客戶端定位BeanCounter宿主,并向它發(fā)送一個(gè)創(chuàng)建請求(404)。工作負(fù)荷管理單元向EJBServer1(402)分配此請求,以維護(hù)事務(wù)-服務(wù)器關(guān)系,BeanCounter宿主用bean=0的初始狀態(tài)實(shí)例化新(405)BeanCounter實(shí)例。在從創(chuàng)建請求返回之前,知道在事務(wù)下創(chuàng)建BeanCounter實(shí)例的容器,發(fā)出register_synchronization請求(406)以向事務(wù)服務(wù)注冊同步對象所擁有的容器。這將確保,在事務(wù)完成處理期間用after_completion調(diào)用容器。當(dāng)客戶端發(fā)出將bean狀態(tài)更新到beans=1的增量請求(407)時(shí),客戶端訪問BeanCounter實(shí)例。工作負(fù)荷管理單元還將此請求分配到EJBServer1(402)以維護(hù)事務(wù)-服務(wù)器關(guān)系。當(dāng)客戶端即將完成事務(wù)時(shí),它向事務(wù)服務(wù)發(fā)出提交請求(408),該請求作為容器注冊的同步對象上的提交處理調(diào)用after_completion(409)的一部分。然后,此對象調(diào)用BeanCounter實(shí)例上的ejbPassivate(410),因?yàn)椋鶕?jù)本發(fā)明,在事務(wù)的范圍內(nèi)訪問的有狀態(tài)會(huì)話bean實(shí)例在該事務(wù)完成時(shí)被鈍化。在此示例中,BeanCounter實(shí)例在ejbFassivate中無事可做,因?yàn)樗鼪]有打開的JDBC連接,其狀態(tài)是可序列化的。在調(diào)用ejbPassivate之后,容器序列化BeanCounter實(shí)例,將它從易失性存儲(chǔ)器中刪除,并將它寫入(411)到bean存儲(chǔ)區(qū)。bean存儲(chǔ)區(qū)不可恢復(fù),保留在非易失性存儲(chǔ)器中,在優(yōu)選實(shí)施例中,非易失性存儲(chǔ)器是一個(gè)硬盤。在事務(wù)完成時(shí),工作負(fù)荷管理單元取消事務(wù)與EJBServer1(402)的關(guān)系。
請注意,在圖4a中,提交了事務(wù),雖然所描述的處理與提交請求(408)是一個(gè)回滾請求的情況相同。此外,雖然優(yōu)選實(shí)施例使用了同步對象和after_completion方法以幫助在事務(wù)完成時(shí)鈍化bean實(shí)例,但是,其他實(shí)施例也可以采用不同的方法。
處理過程在圖4b中繼續(xù),該圖顯示了客戶端的第二個(gè)事務(wù)??蛻舳?401)發(fā)出開始事務(wù)請求(413),工作負(fù)荷管理單元(未顯示)將此請求分配給EJBServer2(412)中的事務(wù)服務(wù),并建立事務(wù)與此服務(wù)器進(jìn)程的關(guān)系。然后,客戶端向BeanCounter實(shí)例發(fā)出增量請求(414)。此請求基于建立的事務(wù)-服務(wù)器關(guān)系分配給EJBServer2(412)。容器認(rèn)識(shí)到,bean實(shí)例不在易失性存儲(chǔ)器中,從bean存儲(chǔ)區(qū)讀取并將它刪除(415)。然后,將bean實(shí)例解除序列化到易失性存儲(chǔ)器,并在其上調(diào)用ejbActivate方法(416)。在本示例中,BeanCounter實(shí)例在ejbActivate中無事可做,無法恢復(fù)其狀態(tài)。然后,將增量請求(414)傳遞到BeanCounter實(shí)例,該請求將其狀態(tài)更新到beans=2。在增量方法返回之前,容器注意到,這是BeanCounter實(shí)例在此事務(wù)中的第一次使用,因此,它發(fā)出register_synchronization請求(417)以向事務(wù)服務(wù)注冊同步對象所擁有的容器。這將確保,在事務(wù)完成處理期間用after_completion調(diào)用容器。當(dāng)客戶端即將完成事務(wù)時(shí),它向發(fā)出提交請求(418),處理過程以與為圖4a所描述的從提交請求(408)開始的同樣的方式繼續(xù)。
如此,有狀態(tài)會(huì)話bean實(shí)例在事務(wù)之間移動(dòng)服務(wù)器進(jìn)程,結(jié)果,每一個(gè)事務(wù)的工作負(fù)荷都得到管理。在沒有本發(fā)明的情況下,創(chuàng)建(404)有狀態(tài)會(huì)話bean實(shí)例將建立客戶端-服務(wù)器關(guān)系,該關(guān)系將導(dǎo)致所有客戶端的事務(wù)在相同服務(wù)器進(jìn)程中運(yùn)行。
值得注意的是,雖然上面的示例考慮了客戶端啟動(dòng)的事務(wù),但是,本發(fā)明還適用于容器或bean啟動(dòng)的事務(wù)。對于容器和bean啟動(dòng)的事務(wù),所涉及的流程將類似于所描述的那些。在這樣的情況下,優(yōu)選實(shí)施例中的區(qū)別是,圖4a和4b中的客戶端(10)調(diào)用的方法將由不同的實(shí)體發(fā)出。例如,不同的EJB的容器或另一個(gè)EJB實(shí)例,可以發(fā)出開始(403、413)和提交(408、418)請求,另一個(gè)EJB實(shí)例或客戶端,可以發(fā)出創(chuàng)建(404)和增量方法(407、414)。
此外,在單個(gè)客戶端請求內(nèi)啟動(dòng)和完成容器管理的事務(wù)。結(jié)果,作為容器管理事務(wù)的一部分被訪問的有狀態(tài)會(huì)話bean實(shí)例,在每個(gè)客戶端請求完成時(shí)被鈍化。這就可以對使用容器管理事務(wù)的所有客戶端請求進(jìn)行工作負(fù)荷管理。然后可以看出,在沒有事務(wù)的情況下,容器還可以在非事務(wù)請求完成時(shí)鈍化有狀態(tài)會(huì)話bean實(shí)例,從而即使有狀態(tài)會(huì)話bean實(shí)例被訪問,也可以對所有請求進(jìn)行工作負(fù)荷管理。
圖5是根據(jù)本發(fā)明的優(yōu)選實(shí)施例的圖4a和4b所示的事務(wù)的略圖??蛻舳?401)運(yùn)行兩個(gè)事務(wù)T1和T2,并在每一個(gè)事務(wù)的過程中,BeanCounter實(shí)例(503)被訪問。T1-a(501)代表客戶端(401)作為事務(wù)T1的一部分發(fā)出的請求。工作負(fù)荷管理單元(12)將所有這些請求路由到EJBServer1(402),這些請求由T1-b(502)代表。在事務(wù)完成時(shí),BeanCounter實(shí)例(503)的序列化表示寫入(504)到bean存儲(chǔ)區(qū)(509)并從EJBServer1(402)中的存儲(chǔ)器刪除。T2-a(506)代表客戶端(401)作為事務(wù)T2的一部分發(fā)出的請求。工作負(fù)荷管理單元(12)將所有這些請求路由到EJBServer2(412),這些請求由T2-b(507)代表。T2首次訪問BeanCounter實(shí)例時(shí),通過從bean存儲(chǔ)區(qū)(509)讀取并從中刪除(508),并在EJBServer2中的存儲(chǔ)器中重新實(shí)例化,它在EJBServer2(402)中重新活化。結(jié)果,即使T1在不同的服務(wù)器中運(yùn)行,T2也可以訪問T1留下的BeanCounter實(shí)例的狀態(tài)。然后,T2將bean實(shí)例的狀態(tài)增加到beans=2。
圖6是根據(jù)本發(fā)明的優(yōu)選實(shí)施例的在非易失性存儲(chǔ)器上保存的能進(jìn)行有狀態(tài)會(huì)話bean的工作負(fù)荷管理的信息類型的說明圖。顯示了根據(jù)本發(fā)明可以實(shí)現(xiàn)的狀態(tài)的序列的兩個(gè)文件的內(nèi)容,可恢復(fù)的路由文件,以及不可恢復(fù)的bean存儲(chǔ)區(qū)。請注意,所顯示的內(nèi)容是保留的信息的細(xì)節(jié),而不是文件的實(shí)際內(nèi)容,因?yàn)楸A粜畔⒌姆绞接性S多種。此外,狀態(tài)也不是詳盡的,只是用來說明概念。
在圖6所示的第一狀態(tài)中,在Server1中有一個(gè)ID為T1的活動(dòng)事務(wù),在bean存儲(chǔ)區(qū)有一個(gè)鍵為B1的鈍化會(huì)話bean實(shí)例。路由表包含(601)事務(wù)id(T1)和在其中啟動(dòng)事務(wù)(server1)的服務(wù)器進(jìn)程的表示。此信息用于維護(hù)事務(wù)-服務(wù)器關(guān)系,以便作為事務(wù)T1的一部分的所有請求都被路由到server1。bean存儲(chǔ)區(qū)包含(602)會(huì)話bean鍵(B1)和其會(huì)話狀態(tài)(beans=1)。在此狀態(tài)下,任何從工作組中的任何服務(wù)器進(jìn)程訪問bean實(shí)例的嘗試都將會(huì)成功。
圖6中的第二個(gè)狀態(tài)是在bean實(shí)例B1在事務(wù)T1的范圍內(nèi)重新活化之后第一個(gè)狀態(tài)的繼續(xù)。路由表內(nèi)容(603)未變化,但bean實(shí)例的記錄已經(jīng)從bean存儲(chǔ)區(qū)刪除,該bean存儲(chǔ)區(qū)現(xiàn)在沒有bean實(shí)例B1的記錄(604)。這是因?yàn)?,bean實(shí)例B1現(xiàn)在在server1中的易失性存儲(chǔ)器中,因此,從server1的任何訪問它的嘗試都將會(huì)成功,但從工作組中的任何其他服務(wù)器進(jìn)程訪問都將會(huì)失敗。
圖6中的第三個(gè)狀態(tài)是在事務(wù)T1被提交之后第二個(gè)狀態(tài)的繼續(xù)。路由表現(xiàn)在沒有已完成的事務(wù)T1的記錄(605),因?yàn)槭聞?wù)-服務(wù)器關(guān)系已經(jīng)撤消。bean存儲(chǔ)區(qū)包含(602)會(huì)話bean鍵(B1)和其更新的會(huì)話狀態(tài)(beans=2),表示bean實(shí)例在事務(wù)完成期間被鈍化。
圖6中的第四狀態(tài)是在bean管理事務(wù)尚末完成的情況下,在鈍化的bean實(shí)例B1已經(jīng)被從server2訪問之后第三個(gè)狀態(tài)的繼續(xù)。路由表包含(607)bean實(shí)例鍵二級B1,以及在其中bean當(dāng)前是活動(dòng)的服務(wù)器進(jìn)程(server2)。此外,bean實(shí)例鍵B1包括表示bean在bean管理事務(wù)下正在被訪問的標(biāo)志。這將確保,下面進(jìn)行的訪問bean實(shí)例的嘗試將被路由到server2。bean存儲(chǔ)區(qū)沒有現(xiàn)在處于活化狀態(tài)的bean實(shí)例B1的記錄(608)。此狀態(tài)將一直保留,直到bean管理事務(wù)完成,此時(shí),bean將被鈍化,狀態(tài)將返回到等價(jià)于圖6中的第三個(gè)狀態(tài)的狀態(tài),其中,路由文件不再具有bean鍵的記錄,bean存儲(chǔ)區(qū)包含會(huì)話bean實(shí)例。
圖4所示的狀態(tài)構(gòu)成了優(yōu)選實(shí)施例中的可能的所有狀態(tài)(一個(gè)除外)。沒有顯示的狀態(tài)是路由表不包含bean實(shí)例的鍵或在其中事務(wù)正在被訪問并且bean存儲(chǔ)區(qū)不包含bean實(shí)例的記錄的事務(wù)的ID。此狀態(tài)可以通過bean實(shí)例不存在或bean實(shí)例在超出事務(wù)的范圍的一個(gè)服務(wù)器進(jìn)程中處于活化狀態(tài)或作為容器管理事務(wù)的一部分來實(shí)現(xiàn)。
因此,顯示了,在本發(fā)明的優(yōu)選實(shí)施例中,會(huì)話bean實(shí)例在一個(gè)事務(wù)完成時(shí)被鈍化,被鈍化的bean實(shí)例的序列化形式在重新活化時(shí)從bean存儲(chǔ)區(qū)刪除。結(jié)果,在重新活化之后,只有bean實(shí)例的狀態(tài)的表示位于易失性存儲(chǔ)器中的重新活化的bean實(shí)例中。這確保了,會(huì)話bean實(shí)例只能存在于一個(gè)位置,只能在完成的事務(wù)性狀態(tài)從不同的服務(wù)器進(jìn)程進(jìn)行訪問,如果在事務(wù)完成之前從失敗的服務(wù)器進(jìn)程在一個(gè)事務(wù)中進(jìn)行訪問,則無法訪問。這就保證了,如果未提交的事務(wù)性的更新丟失,就無法訪問有狀態(tài)會(huì)話bean,結(jié)果,有狀態(tài)會(huì)話bean實(shí)例中的可訪問的狀態(tài)始終反映所有更新。如果如此嘗試訪問已經(jīng)無法訪問的有狀態(tài)會(huì)話bean實(shí)例,則請求者將收到一個(gè)相應(yīng)的異常,如java.rmi.NosuchObjectException。
圖7顯示了根據(jù)本發(fā)明的優(yōu)選實(shí)施例的當(dāng)向服務(wù)器進(jìn)程分配入站請求時(shí)工作負(fù)荷管理單元所遵循的邏輯。在步驟701中,進(jìn)行檢查,以查看請求是否為事務(wù)性的。如果請求是事務(wù)性的,則從請求中獲取事務(wù)ID,并在步驟702中,將該ID與路由表中的事務(wù)ID進(jìn)行比較。如果找到ID,則在步驟703中,將請求分配給路由表中指定的服務(wù)器進(jìn)程。如果未找到ID,則在步驟704中,將請求分配給工作組中任何服務(wù)器進(jìn)程。如果請求不是事務(wù)性的,則在步驟705中,進(jìn)行檢查,以查看請求是否指向在bean管理事務(wù)下正在被訪問的bean實(shí)例。此信息位于bean實(shí)例的鍵中的標(biāo)志中。如果是這種情況,則從請求獲取bean實(shí)例的鍵,并在步驟706中,將該ID與路由表中的bean實(shí)例鍵進(jìn)行比較。如果找到該鍵,則在步驟707中,將請求分配給路由表中指定的服務(wù)器進(jìn)程。如果未找到該鍵,則在步驟704中,將請求分配給工作組中任何服務(wù)器進(jìn)程。如果bean實(shí)例的鍵沒有指出bean實(shí)例在bean管理事務(wù)下正在被訪問,則不對路由表進(jìn)行搜索,并在步驟704中將請求分配給任何服務(wù)器。
請注意,在bean實(shí)例的鍵中使用標(biāo)志以指出bean實(shí)例在bean管理事務(wù)下正在被訪問,是一種性能優(yōu)化方法。在優(yōu)選實(shí)施例中,如果bean鍵在bean管理事務(wù)下正在被訪問,那么,它將只位于路由表中。結(jié)果,使用標(biāo)志意味著,如果bean實(shí)例的鍵沒有設(shè)置標(biāo)志,則沒有必要搜索路由表。如果沒有使用標(biāo)志,則對于指向bean實(shí)例的所有入站請求的所有bean實(shí)例鍵,都必須檢查路由表。
值得注意的是,優(yōu)選實(shí)施例使用了與CORBA兼容的OTS事務(wù)作為表示工作單元的方式。然而,本發(fā)明還可以應(yīng)用于其他類型的工作單元,如不同類型的事務(wù)、會(huì)話、業(yè)務(wù)方法、客戶端請求,或?qū)⒁粋€(gè)或多個(gè)事件組合到一個(gè)單元的任何其他方式。這可以通過在所選的工作單元完成時(shí)鈍化有狀態(tài)會(huì)話bean實(shí)例來實(shí)現(xiàn)。此外,某些實(shí)施例可以使用工作單元的層次結(jié)構(gòu)。例如,在其中OTS事務(wù)是所選的工作單元的優(yōu)選實(shí)施例中所描述的系統(tǒng)中,在沒有事務(wù)的情況下,也可以使用業(yè)務(wù)處理方法作為工作單元。如果客戶端超出事務(wù)范圍請求業(yè)務(wù)方法,并且業(yè)務(wù)方法直接或間接地訪問有狀態(tài)會(huì)話bean實(shí)例,那么,可以在業(yè)務(wù)方法完成時(shí)鈍化有狀態(tài)會(huì)話bean實(shí)例。優(yōu)選情況下,這將在客戶端調(diào)用的業(yè)務(wù)方法的postInvoke處理期間進(jìn)行。然后,這為涉及有狀態(tài)會(huì)話bean實(shí)例的客戶端調(diào)用的業(yè)務(wù)方法提供工作負(fù)荷管理。
值得進(jìn)一步指出的是,在優(yōu)選實(shí)施例中,選擇了有狀態(tài)會(huì)話bean作為在存儲(chǔ)器中維護(hù)會(huì)話狀態(tài)的程序?qū)嶓w類型的優(yōu)選實(shí)施例。然而,本發(fā)明可以應(yīng)用于需要工作負(fù)荷管理支持的在存儲(chǔ)器中維護(hù)狀態(tài)的任何類型的實(shí)體,如Java bean或C++對象。
優(yōu)選情況下,本發(fā)明作為與計(jì)算機(jī)系統(tǒng)一起使用的計(jì)算機(jī)程序產(chǎn)品來實(shí)現(xiàn)。這樣的實(shí)現(xiàn)方式可以包括固定在諸如計(jì)算機(jī)可讀的介質(zhì)(例如,磁盤、CD-ROM、ROM或硬盤)之類的有形介質(zhì),或通過調(diào)制解調(diào)器或其他接口設(shè)備,通過有形的介質(zhì)(包括而不僅限于,光學(xué)或模擬通信線路),或使用無線技術(shù)(包括而不僅限于,微波、紅外線或其他傳輸技術(shù))可傳輸?shù)牡接?jì)算機(jī)系統(tǒng)的一系列計(jì)算機(jī)可讀的指令。一系列計(jì)算機(jī)可讀的指令實(shí)現(xiàn)了前面所描述的功能的全部或一部分。
那些精通本技術(shù)的人將理解,這樣的計(jì)算機(jī)可讀的指令可以以許多編程語言編寫,以便與許多計(jì)算機(jī)體系結(jié)構(gòu)或操作系統(tǒng)一起使用。此外,這樣的指令可以使用任何存儲(chǔ)技術(shù)來進(jìn)行存儲(chǔ),當(dāng)前的或未來的,包括而不僅限于,半導(dǎo)體、磁性、或光學(xué),或使用任何通信技術(shù),當(dāng)前的或未來的,包括而不僅限于,光學(xué)、紅外線或微波??梢灶A(yù)期,這樣的計(jì)算機(jī)程序產(chǎn)品可以作為可移動(dòng)介質(zhì)附帶打印或電子文檔來進(jìn)行分發(fā),例如,包裝的軟件,預(yù)裝到計(jì)算機(jī)系統(tǒng)中,例如,裝到系統(tǒng)ROM或硬盤中,或從服務(wù)器或電子公告板通過網(wǎng)絡(luò)(例如,因特網(wǎng)或萬維網(wǎng))進(jìn)行分發(fā)。
權(quán)利要求
1.在具有非易失性存儲(chǔ)器存儲(chǔ)設(shè)備和至少一個(gè)服務(wù)器的能夠運(yùn)行服務(wù)器進(jìn)程的數(shù)據(jù)處理系統(tǒng)中,一種對程序?qū)嶓w進(jìn)行數(shù)據(jù)處理的方法,包括下列步驟作為第一服務(wù)器進(jìn)程的一部分,通過將程序?qū)嶓w的實(shí)例寫入到所說的存儲(chǔ)設(shè)備上的程序?qū)嶓w存儲(chǔ)區(qū),并從所說的服務(wù)器進(jìn)程中將其刪除,來鈍化所說的程序?qū)嶓w的實(shí)例;作為第二服務(wù)器進(jìn)程的一部分,通過從所說的程序?qū)嶓w存儲(chǔ)區(qū)讀取所說的程序?qū)嶓w的所說的實(shí)例,并在所說的服務(wù)器進(jìn)程中重新創(chuàng)建它,來重新活化所說的程序?qū)嶓w的所說的實(shí)例;以及根據(jù)工作負(fù)荷分配算法選擇在其中重新活化所說的程序?qū)嶓w實(shí)例的服務(wù)器進(jìn)程。
2.根據(jù)權(quán)利要求1所述的方法,其中,所說的鈍化服務(wù)器進(jìn)程代表在其中訪問所說的程序?qū)嶓w實(shí)例的客戶端執(zhí)行工作單元,所說的鈍化步驟在完成所說的工作單元時(shí)鈍化所說的程序?qū)嶓w實(shí)例。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所說的工作單元包括事務(wù)。
4.根據(jù)權(quán)利要求2所述的方法,其特征在于,所說的工作單元包括業(yè)務(wù)方法。
5.根據(jù)前面的任何一個(gè)權(quán)利要求所述的方法,其特征在于,所說的程序?qū)嶓w包括有狀態(tài)會(huì)話bean。
6.根據(jù)權(quán)利要求2到4中的任何一個(gè)權(quán)利要求所述的方法,其特征在于,所說的重新活化步驟從所說的程序?qū)嶓w存儲(chǔ)區(qū)讀取所說的程序?qū)嶓w的所說的實(shí)例并將其刪除,從而確保,如果所說的程序?qū)嶓w實(shí)例在所說的工作單元下重新活化,則在直到所說的工作單元完成之前無法從所說的工作單元外面重新訪問它。
7.根據(jù)權(quán)利要求1到4中的任何一個(gè)權(quán)利要求所述的方法,進(jìn)一步包括下列步驟在所說的存儲(chǔ)設(shè)備上維護(hù)一個(gè)路由表中程序?qū)嶓w實(shí)例位置信息,其特征在于,所說的路由表用于定位許多程序?qū)嶓w實(shí)例,所說的信息表示程序?qū)嶓w實(shí)例在所說的許多服務(wù)器進(jìn)程中的某一個(gè)中是處于活化狀態(tài),還是在所說的程序?qū)嶓w存儲(chǔ)區(qū)處于鈍化狀態(tài)。
8.根據(jù)權(quán)利要求7所述的方法,進(jìn)一步包括下列步驟將一個(gè)鍵與所說的許多程序?qū)嶓w實(shí)例中的至少一個(gè)關(guān)聯(lián),用于將所說的至少一個(gè)程序?qū)嶓w實(shí)例標(biāo)識(shí)為請求的目標(biāo),其中,所說的鍵包括一個(gè)標(biāo)志,表示所說的至少一個(gè)程序?qū)嶓w實(shí)例的位置信息在所說的路由表中存在。
9.一種存儲(chǔ)在計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì)上的計(jì)算機(jī)程序產(chǎn)品,用于具有非易失性存儲(chǔ)器存儲(chǔ)設(shè)備和至少一個(gè)服務(wù)器的能夠運(yùn)行服務(wù)器進(jìn)程的數(shù)據(jù)處理系統(tǒng)中,所說的產(chǎn)品包括指令,當(dāng)執(zhí)行這些指令時(shí),導(dǎo)致所說的系統(tǒng)通過執(zhí)行下列步驟來處理程序?qū)嶓w作為第一服務(wù)器進(jìn)程的一部分,通過將程序?qū)嶓w的實(shí)例寫入到所說的存儲(chǔ)設(shè)備上的程序?qū)嶓w存儲(chǔ)區(qū),并從所說的服務(wù)器進(jìn)程中將其刪除,來鈍化所說的程序?qū)嶓w的實(shí)例;作為第二服務(wù)器進(jìn)程的一部分,通過從所說的程序?qū)嶓w存儲(chǔ)區(qū)讀取所說的程序?qū)嶓w的所說的實(shí)例,并在所說的服務(wù)器進(jìn)程中重新創(chuàng)建它,來重新活化所說的程序?qū)嶓w的所說的實(shí)例;以及根據(jù)工作負(fù)荷分配算法選擇在其中重新活化所說的程序?qū)嶓w實(shí)例的服務(wù)器進(jìn)程。
10.根據(jù)權(quán)利要求9所述的計(jì)算機(jī)程序產(chǎn)品,其中,所說的鈍化服務(wù)器進(jìn)程代表在其中訪問所說的程序?qū)嶓w實(shí)例的客戶端執(zhí)行工作單元,所說的鈍化步驟在完成所說的工作單元時(shí)鈍化所說的程序?qū)嶓w實(shí)例。
11.根據(jù)權(quán)利要求10所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所說的工作單元包括事務(wù)。
12.根據(jù)權(quán)利要求10所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所說的工作單元包括業(yè)務(wù)方法。
13.根據(jù)權(quán)利要求9到12中的任何一個(gè)權(quán)利要求所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所說的程序?qū)嶓w包括有狀態(tài)會(huì)話bean。
14.根據(jù)權(quán)利要求10到12中的任何一個(gè)權(quán)利要求所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所說的重新活化步驟從所說的程序?qū)嶓w存儲(chǔ)區(qū)讀取所說的程序?qū)嶓w的所說的實(shí)例并將其刪除,從而確保,如果所說的程序?qū)嶓w實(shí)例在所說的工作單元下重新活化,則在直到所說的工作單元完成之前無法從所說的工作單元外面重新訪問它。
15.根據(jù)權(quán)利要求9到12中的任何一個(gè)權(quán)利要求所述的計(jì)算機(jī)程序產(chǎn)品,進(jìn)一步包括下列步驟在所說的存儲(chǔ)設(shè)備上一個(gè)路由表中維護(hù)程序?qū)嶓w實(shí)例位置信息,其特征在于,所說的路由表用于定位許多程序?qū)嶓w實(shí)例,所說的信息表示程序?qū)嶓w實(shí)例在所說的許多服務(wù)器進(jìn)程中的某一個(gè)中是處于活化狀態(tài),還是在所說的程序?qū)嶓w存儲(chǔ)區(qū)處于鈍化狀態(tài)。
16.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)程序產(chǎn)品,進(jìn)一步包括下列步驟將一個(gè)鍵與所說的許多程序?qū)嶓w實(shí)例中的至少一個(gè)關(guān)聯(lián),用于將所說的至少一個(gè)程序?qū)嶓w實(shí)例標(biāo)識(shí)為請求的目標(biāo),其特征在于,所說的鍵包括一個(gè)標(biāo)志,表示所說的至少一個(gè)程序?qū)嶓w實(shí)例的位置信息在路由表中存在。
17.一種數(shù)據(jù)處理系統(tǒng),包括至少一個(gè)服務(wù)器;許多能夠在所說的至少一個(gè)服務(wù)器上運(yùn)行的服務(wù)器進(jìn)程,其中每個(gè)服務(wù)器進(jìn)程都支持程序?qū)嶓w;以及每一個(gè)服務(wù)器進(jìn)程都可以訪問到的非易失性存儲(chǔ)器存儲(chǔ)設(shè)備;其中,每一個(gè)服務(wù)器進(jìn)程都包括用于通過將所說的程序?qū)嶓w的實(shí)例寫入到所說的存儲(chǔ)設(shè)備上的程序?qū)嶓w存儲(chǔ)區(qū)來鈍化所說的程序?qū)嶓w的實(shí)例的裝置;用于通過從所說的程序?qū)嶓w存儲(chǔ)區(qū)讀取所說的程序?qū)嶓w的實(shí)例,并使用它來重新創(chuàng)建所說的程序?qū)嶓w實(shí)例,來重新活化所說的程序?qū)嶓w的實(shí)例的裝置;所說的用于重新活化的裝置能夠重新活化被不同的服務(wù)器進(jìn)程的鈍化裝置鈍化的程序?qū)嶓w實(shí)例;以及用于根據(jù)工作負(fù)荷分配算法選擇在其中重新活化所說的特定程序?qū)嶓w實(shí)例的服務(wù)器進(jìn)程的裝置。
18.根據(jù)權(quán)利要求17所述的數(shù)據(jù)處理系統(tǒng),所說的許多服務(wù)器進(jìn)程中的每一個(gè)都進(jìn)一步包括用于代表在其中訪問所說的程序?qū)嶓w的第一個(gè)實(shí)例的客戶端執(zhí)行工作單元的裝置;其中,所說的用于鈍化所說的程序?qū)嶓w實(shí)例的裝置在所說的工作單元完成時(shí)鈍化所說的第一個(gè)程序?qū)嶓w實(shí)例。
19.根據(jù)權(quán)利要求18所述的數(shù)據(jù)處理系統(tǒng),其特征在于,所說的工作單元包括事務(wù)。
20.根據(jù)權(quán)利要求18所述的數(shù)據(jù)處理系統(tǒng),其特征在于,所說的工作單元包括業(yè)務(wù)方法。
21.根據(jù)權(quán)利要求17到20中的任何一個(gè)權(quán)利要求所述的數(shù)據(jù)處理系統(tǒng),其特征在于,所說的程序?qū)嶓w包括有狀態(tài)會(huì)話bean。
22.根據(jù)權(quán)利要求18到20中的任何一個(gè)權(quán)利要求所述的數(shù)據(jù)處理系統(tǒng),其特征在于,所說的重新活化裝置從所說的程序?qū)嶓w存儲(chǔ)區(qū)讀取所說的程序?qū)嶓w的實(shí)例并將其刪除,從而確保,如果所說的重新活化裝置在所說的工作單元中重新活化所說的第一個(gè)程序?qū)嶓w實(shí)例,則在直到所說的工作單元完成之前無法從所說的工作單元外面重新訪問所說的第一個(gè)程序?qū)嶓w實(shí)例。
23.根據(jù)權(quán)利要求17到20中的任何一個(gè)權(quán)利要求所述的數(shù)據(jù)處理系統(tǒng),所說的許多服務(wù)器進(jìn)程中的每一個(gè)都進(jìn)一步包括用于在所說的存儲(chǔ)設(shè)備上維護(hù)一個(gè)路由表中程序?qū)嶓w實(shí)例位置信息的裝置,其中,所說的路由表用于定位許多程序?qū)嶓w實(shí)例,所說的信息表示程序?qū)嶓w在所說的許多服務(wù)器進(jìn)程中的某一個(gè)中是處于活化狀態(tài),還是在所說的程序?qū)嶓w存儲(chǔ)區(qū)處于鈍化狀態(tài)。
24.根據(jù)權(quán)利要求23所述的數(shù)據(jù)處理系統(tǒng),每一個(gè)服務(wù)器進(jìn)程都進(jìn)一步包括用于將一個(gè)鍵與一個(gè)程序?qū)嶓w實(shí)例關(guān)聯(lián)的裝置,用于將所說的程序?qū)嶓w實(shí)例標(biāo)識(shí)為請求的目標(biāo),其中,所說的鍵包括一個(gè)標(biāo)志,表示所說的至少一個(gè)程序?qū)嶓w實(shí)例的位置信息在路由表中存在。
全文摘要
在包括許多服務(wù)器進(jìn)程的工作負(fù)荷管理系統(tǒng)中,每一個(gè)服務(wù)器進(jìn)程都能夠支持一個(gè)給定的程序?qū)嶓w,如,Enterprise JavaBeans
文檔編號(hào)G06F9/46GK1516831SQ02807390
公開日2004年7月28日 申請日期2002年3月7日 優(yōu)先權(quán)日2001年3月29日
發(fā)明者安德魯·S·克萊門特, 安·E.·多爾頓, 巴里·迪克恩森, 托馬斯·J.·弗路恩德, 喬納森·P.·H.勞倫斯, 伊恩·J.·米切爾, 格林·諾明頓, 史蒂文·普威爾, 安索尼·斯多瑞, J. 弗路恩德, P. H.勞倫斯, 多爾頓, 斯多瑞, 普威爾, J. 米切爾, 安德魯 S 克萊門特, 諾明頓, 迪克恩森 申請人:國際商業(yè)機(jī)器公司