国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

按要求進(jìn)行決定是否有狀態(tài)的EJB(圖)

2019-11-18 12:33:31
字體:
供稿:網(wǎng)友

  當(dāng)提到開發(fā)J2EE服務(wù)端組件時(shí),EJB是事實(shí)上的標(biāo)準(zhǔn)。會話bean被用作業(yè)務(wù)邏輯組件,并且主要是這兩種類型:有狀態(tài)的和無狀態(tài)的。Bean的類型,有狀態(tài)或無狀態(tài),是在布署時(shí)通過布署參數(shù)決定的。但是,有很多情況可能是在運(yùn)行時(shí)才能決定是否需要有狀態(tài)的bean。這篇文章中,我會解釋一種用來在運(yùn)行時(shí)選擇是否有狀態(tài)的bean的模式。
  
  有狀態(tài)和無狀態(tài)的會話bean
  
  會話bean為它的客戶進(jìn)行工作,通過在服務(wù)器端執(zhí)行業(yè)務(wù)任務(wù)將業(yè)務(wù)邏輯的復(fù)雜度與客戶屏蔽開來。無狀態(tài)的會話bean不保持任何與客戶的會話狀態(tài),發(fā)給bean的每一次請求需同時(shí)提供數(shù)據(jù)來進(jìn)行請求處理。有狀態(tài)的會話bean,與之相反,可以保持狀態(tài),并且該狀態(tài)可以在與客戶的多次會話中存在。
  
  有狀態(tài)的bean帶來了支持會話狀態(tài)的好處但同時(shí)付出了性能的代價(jià)。無狀態(tài)bean具有更好的性能,但卻又不具備與客戶端的親合力。EJB容器可以將無狀態(tài)bean放入緩沖池中,并當(dāng)有用戶請求無狀態(tài)bean時(shí),從中選取任意一個bean來為其提供服務(wù)。
  
  使用一個有狀態(tài)還是無狀態(tài)bean是設(shè)計(jì)時(shí)的選擇,EJB的布署描述符描述了會話bean在EJB容器中的狀態(tài)。并沒有這樣的先例,一個bean可以由處理結(jié)果來動態(tài)的改變其狀態(tài)。
  
  一個示例情景
  
  考慮一個這樣的情景:搜索組件需要設(shè)計(jì)為讓客戶端通過不同的參數(shù)來搜索數(shù)據(jù)倉庫。一個有關(guān)顧客的搜索可能只是這個組件提供的各式各樣的搜索中的一小部分。假如客戶端以一個特定的顧客登錄,那么這個組件的的后續(xù)搜索應(yīng)該符合這個顧客的相關(guān)的配置。這些搜索應(yīng)該包含符合這個顧客條件的產(chǎn)品的列表。假如沒有登錄,那么搜索應(yīng)該返回系統(tǒng)默認(rèn)的顧客的結(jié)果。出于保持示例通用的原因,我沒有具體說明這個特定的搜索,但這個情景對于很多應(yīng)用來說是很普通的情況。
  
  我將闡述一種模式,它提供了動態(tài)地指定bean的有狀態(tài)或無狀態(tài),并把此模式應(yīng)用到上述示例業(yè)務(wù)情景中。使這種模式成為必要的動力在于:
  
  ·通常只有兩個粗分類的會話EJB存在
  
  ·沒有辦法動態(tài)地將一個無狀態(tài)地bean轉(zhuǎn)化為有狀態(tài)的bean
  
  ·業(yè)務(wù)情景要求根據(jù)處理結(jié)果將一個無狀態(tài)的bean轉(zhuǎn)換為有狀態(tài)bean
  
  ·客戶不應(yīng)該承擔(dān)創(chuàng)建一個有狀態(tài)的bean責(zé)任,它應(yīng)該在后臺執(zhí)行。
  
  模式
  
  我會細(xì)述解決以上問題的模式。創(chuàng)建一個focus類,它是一個POJO(普通的舊式java對象)。focus類擁有組件的邏輯實(shí)現(xiàn)。將組件同時(shí)模型化為有狀態(tài)和無狀態(tài)bean。會話bean將會實(shí)例化并使用focus來實(shí)現(xiàn)客戶端請求。客戶端,默認(rèn)地,通過代理訪問無狀態(tài)bean的服務(wù)。假如處理結(jié)果表明客戶需要一個有狀態(tài)地用務(wù),一個有狀態(tài)的服務(wù)將會創(chuàng)建,有狀態(tài)的服務(wù)將服務(wù)于客戶端的后續(xù)請求。有狀態(tài)的服務(wù)也使用focus類,并在調(diào)用focus類的方法時(shí)傳遞客戶的狀態(tài)。
  
  類算法如圖1顯示,其中有模式中有關(guān)的主要的類以及展示了不同類之間的協(xié)作。
  
 按要求進(jìn)行決定是否有狀態(tài)的EJB(圖)(圖一)
  圖1.無狀態(tài)/有狀態(tài)會話bean模式的算法

  
  客戶端
  
  客戶端是需要使用EJB組件提供的服務(wù)的任意Java對象。客戶端使用代理來和服務(wù)交互。客戶端并不知道有狀態(tài)或無狀態(tài)服務(wù)的存在,僅只是使用EJB提供的服務(wù)。
  
  代理
  
  這兒的代理是一種服務(wù)定位器的組合,也是一種業(yè)務(wù)代理模式。代理負(fù)責(zé)查找無狀態(tài)的服務(wù),并調(diào)用其上的服務(wù)。代理也負(fù)責(zé)處理返回的數(shù)據(jù)集,存儲有狀態(tài)的bean的處理器,假如有狀態(tài)的處理器不存在則調(diào)用有狀態(tài)服務(wù)。一個可選的步驟是代理解析作為參數(shù)傳遞的數(shù)據(jù)集,假如處理器指向了一個有效地有狀態(tài)bean則調(diào)用有狀態(tài)服務(wù)。
  
  無狀態(tài)服務(wù)
  
  無狀態(tài)服務(wù)是一個提供給客戶組件服務(wù)的無狀態(tài)EJB。無狀態(tài)服務(wù)沒有提供與客戶端的會話狀態(tài),它是由代理來查找選取的。無狀態(tài)bean使用focus類提供的功能。
  
  有狀態(tài)服務(wù)
  
  有狀態(tài)服務(wù)由無狀態(tài)服務(wù)運(yùn)行中創(chuàng)建的,當(dāng)它決定客戶的請求不應(yīng)由無狀態(tài)來提供。這由請求數(shù)據(jù)或者無狀態(tài)服務(wù)中的處理邏輯來決定。有狀態(tài)服務(wù)具有存儲調(diào)用客戶狀態(tài)的能力并且將這些狀態(tài)應(yīng)用到focus類中。
  
  數(shù)據(jù)集
  
  數(shù)據(jù)集是由服務(wù)器返回給客戶端的一個通用的返回。數(shù)據(jù)集具有作為由方法調(diào)用產(chǎn)生的服務(wù)返回的實(shí)際數(shù)據(jù),并且還具有與返回客戶相關(guān)的配置信息。數(shù)據(jù)集同時(shí)具有有狀態(tài)服務(wù)的處理器,它被代理用來請求有狀態(tài)服務(wù)所需要的數(shù)據(jù)。
  
  Focus類
  
  Focus類有對應(yīng)組件中的主業(yè)務(wù)邏輯。Focus類包含了基本功能并不包含任何狀態(tài)。它基于傳入的數(shù)據(jù)進(jìn)行處理,并在方法調(diào)用之間不保持狀態(tài)。作為一個經(jīng)驗(yàn),好的實(shí)踐是在focus類中實(shí)現(xiàn)這些方法,而focus對于有狀態(tài)和無狀態(tài)服務(wù)來說是平等的。
  
  協(xié)作
  
  客戶端實(shí)例化代理并通過它調(diào)有組件上的任意方法。代理的邏輯是查找無狀態(tài)bean,并調(diào)用相應(yīng)無狀態(tài)服務(wù)上的對應(yīng)方法。無狀態(tài)bean處理請求并調(diào)用focus類得到結(jié)果。處理的結(jié)果以數(shù)據(jù)集對象的型式返回給客戶端。
  
  假如在處理請求的過程中,無狀態(tài)服務(wù)決定服務(wù)需要為將來的處理存儲請求的狀態(tài),那么無狀態(tài)服務(wù)則創(chuàng)建一個有狀態(tài)服務(wù)。有狀態(tài)bean的處理器存儲在數(shù)據(jù)集對象中返回給客戶。當(dāng)然,返回的數(shù)據(jù)集也包含了客戶端所請求的返回?cái)?shù)據(jù)。代理將會在返回給客戶之前解析數(shù)據(jù)集對象,并將有狀態(tài)bean的處理器作為狀態(tài)存儲起來。當(dāng)客戶對代理進(jìn)行下一次調(diào)用時(shí),代理將會調(diào)用作為代理的狀態(tài)一部分的有狀態(tài)bean的處理器。
  
  有狀態(tài)bean可以使用代表了客戶的狀態(tài),并將它作為附加地屬性傳遞給focus類。Focus類不需要關(guān)心是有狀態(tài)服務(wù)的請求還是無狀態(tài)服務(wù)的請求。從有狀態(tài)bean而來的請求擁有附加的狀態(tài)信息,因此可以主結(jié)果反映出代表客戶的任意的會話狀態(tài)。圖2以UML流程圖展示了它們之間的關(guān)系。
  
 按要求進(jìn)行決定是否有狀態(tài)的EJB(圖)(圖二)
  圖2.模式參與者之間的交互序列

  
  應(yīng)用此模式
  
  我會用上述模式來解決示例情景的問題。客戶端使用代理來使用查找組件的功能。代理將會查找代碼并暴露出服務(wù)所暴露的相同的一組方法。客戶端調(diào)用代理上的searchParam1方法,而代理調(diào)用無狀態(tài)服務(wù)上的searchParam1方法。
  
  假如客戶端調(diào)用了login方法,代理就調(diào)用無狀態(tài)服務(wù)上的相對應(yīng)的方法。假如查找的結(jié)果是單個的顧客,無狀態(tài)服務(wù)就創(chuàng)建一個有狀態(tài)服務(wù)并將客戶細(xì)節(jié)傳給有狀態(tài)服務(wù)的ejbCreate方法。無狀態(tài)服務(wù)也創(chuàng)建一個DataSet的實(shí)例,并設(shè)置用戶數(shù)據(jù),同時(shí)也在其上設(shè)置有狀態(tài)bean的處理器,在DataSet上代理保存了處理器并將DataSet傳遞給客戶。
  
  客戶現(xiàn)在需要得到與自己相關(guān)的一組產(chǎn)品的列表。客戶端調(diào)用代理的retrievePRodUCts方法。代理得到有狀態(tài)的處理器,并調(diào)用有狀態(tài)bean的相關(guān)的方法。
  
  另外的情景
  
  模式是通用的并能用在不同的應(yīng)用上。上述模式可以用在需要使用一個值列表處理器時(shí)。使用無狀態(tài)bean可以進(jìn)行一般的搜索,并且當(dāng)結(jié)果的大小超過能接受的最大值時(shí),我們可以創(chuàng)建一個有狀態(tài)bean并將結(jié)果傳遞到以一個數(shù)據(jù)集對象的形式存在的緩存中。客戶端通過代理請求下一個記錄集,代理可以轉(zhuǎn)到有狀態(tài)bean并存儲細(xì)節(jié),比如,最后的記錄處理,最大的對象記錄等等。
  
  相關(guān)模式
  
  服務(wù)定位器模式:服務(wù)定位器模式降低了客戶的復(fù)雜度,這種復(fù)雜度由客戶端的依靠,操作需要,查找和創(chuàng)建過程產(chǎn)生,這些都是與資源緊密聯(lián)系的。為了消除這些問題,這個模式提供了一種技術(shù)來抽象所有的依靠性和網(wǎng)絡(luò)細(xì)節(jié)到服務(wù)定位器中。
  
  業(yè)務(wù)代理模式:業(yè)務(wù)代理擔(dān)當(dāng)客戶端的業(yè)務(wù)抽象;它提供了抽象同時(shí)隱藏了業(yè)務(wù)服務(wù)的實(shí)現(xiàn)。使用業(yè)務(wù)代理降低了表現(xiàn)層和系統(tǒng)服務(wù)層之間的耦合。依靠實(shí)現(xiàn)策略,業(yè)務(wù)代理可以保護(hù)客戶端免受系統(tǒng)服務(wù)API可能的錯誤的侵襲。潛在地,這也就降低了當(dāng)業(yè)務(wù)服務(wù)API或底層實(shí)現(xiàn)變化時(shí)影響到表現(xiàn)層代碼。
  
  值列表處理器: 值列表處理器模式創(chuàng)建一個值列表處理器來控制查詢功能和返回結(jié)果的緩存。值列表處理器直接訪問一個DAO(數(shù)據(jù)訪問對象)來執(zhí)行所需的查詢。值列表處理器將DAO的返回結(jié)果放到一個傳輸對象的集合中。客戶端向值列表處理器發(fā)出請求。值列表處理器返回所需的查詢結(jié)果。值列表處理器實(shí)現(xiàn)了迭代器模式(GoF)來解決上述情況。
  
  結(jié)論
  
  動態(tài)的EJB狀態(tài)模式幫助模型組件同時(shí)具有了有狀態(tài)和無狀的行為。一個使用些模式的組件提供了無狀態(tài)會話bean的性能和滿足了客戶端的有狀態(tài)的需要。使用此模式的客戶端擁有一個簡單的統(tǒng)一的接口,并且不感知內(nèi)部有狀態(tài)bean和無狀態(tài)bean之間的切換。這個模式和其它J2EE模式是自然地匹配的,比如業(yè)務(wù)代理模式和服務(wù)定位器模式。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 色达县| 涡阳县| 陵水| 乌拉特前旗| 托克托县| 武山县| 齐齐哈尔市| 巴林右旗| 东光县| 普格县| 科技| 锡林郭勒盟| 雷山县| 东城区| 沽源县| 五莲县| 内江市| 大埔县| 绵竹市| 高青县| 深圳市| 谷城县| 大兴区| 嘉祥县| 吉林省| 吉隆县| 靖江市| 贡觉县| 无棣县| 汉中市| 乌兰察布市| 双峰县| 楚雄市| 巴马| 万荣县| 合阳县| 玉环县| 乌苏市| 丰城市| 博客| 徐汇区|