摘 要:討論一種J2EE設計模式Session Facade在分布式系統開發設計中的使用,進一步針對分布式系統并行處理的復雜性,結合Singleton模式提出對Session Facade的一種改進方法。通過設計模式的改進可以顯著提高某一個領域內系統開發設計的效率,能夠有效增強系統的安全性、數據完整性、性能、可維護性和可擴展性。
關鍵詞:單子模式; 會話門面; 分布式; 并行計算
中圖分類號:TP311.5 文獻標識碼:A
文章編號:1004-373X(2008)10-054-03
Research and Application on Session Facade in Distributed System
SHI Liang
(School of ElectronicInformation,Jiangsu University of Science and Technology,Zhenjiang,212003,China)
Abstract:Design pattern is the elegant solution to common problems in software design.The application of a type of J2EE design pattern-Session Facade is discussed.Combined with Singleton,a method to improve Session Facade for the complexity of parallel programming is put forward.The efficiency of developing and designing a system of a specified domain can be improved remarkably by design pattern,therefore it can enhance numerous aspects of the system,including security,data integrity,manageability,and scalability.
Keywords:singleton;session facade;distributed;parallel computing
近年來,隨著網絡技術發展和應用的需要,分布式應用軟件系統的開發逐漸成為軟件界關注的焦點。為此,Microsoft在Visual C++的基礎上推出了C# ;Sun也在Java 2的基礎上推出了J2EE,C#是J2EE的競爭對手,不過就分布式應用程序的開發平臺來講,目前大部分軟件開發人員還是傾向于J2EE。而各種J2EE設計模式的出現更是為系統的開發設計提供了極為方便的解決方案,多種模式的組合顯著提高了系統開發的效率和性能[1,2]。與單進程或單線程應用程序比較,分布式應用程序有他自身的特點。分布式的體系結構以及多層之間的通信會帶來很多性能問題[3]。本文將對文獻[4]中的Session Facade設計模式在分布式系統開發中的設計使用進行討論,最后針對并行計算結合Singleton模式提出一種改進方法,展示了正確的設計Session Facade設計模式并針對特殊情況對其改進后應用到分布式應用程序開發中,提高開發效率的同時還提高了系統的性能。
1 Session Facade(會話門面)模式
客戶端可以直接通過網絡訪問參與工作流的業務對象,如圖1所示,這樣處理時存在著幾個問題:
(1) 當依靠RMI-IIOP技術進行跨越網絡的調用時,系統性能會受到極大影響。如果一個客戶端需要2個業務對象的信息(例如說賬戶余額和賬戶所有者姓名),則將需要2個遠程方法調用。當存在著大量的客戶端,而每個客戶端又需要調用多個業務對象時,這種細粒度的網絡調用就會成倍的增加,系統性能就會因為網絡負載而降低。
(2) 更重要的是,如果允許 客戶端直接訪問業務對象,那么就要求客戶端了解業務對象的內部方法,這樣就把業務模型的細節不適當地暴露給客戶端,從而增加了客戶端與業務對象之間的耦合度。當業務對象的方法做了改動時,調用他的客戶端的程序也要進行相應的修改。這樣做就違背了EJB的設計中要求具有良好的可移植性的原則。

Session Facade[4]模式為避免這些問題提供了很好的解決方案。Facade[5]模式描述為:“為子系統中的一套接口提供了一個統一的接口。Facade 定義了一個更高層次的接口,使子系統更容易使用。” 在EJB設計中,Session Facade是應用最廣泛的設計模式。他應用Session Bean實現Facade模式的思想,把構成子系統的一套業務對象“包裝”在Session Bean中。這樣,Session Facade作為客戶端訪問業務對象的攔截器,屏蔽了業務對象。EJB客戶端訪問Session Bean代替訪問業務對象,當一個EJB客戶端需要調用多個業務對象的方法時,他只需要進行一次粗粒度的遠程方法調用,將請求送給Session Facade,再由Session Facade通過本地方法調用,調用相應的業務對象,執行其方法。這樣就減輕了網絡負載,提高了系統性能。如圖2所示。

2 Session Facade模式的設計應用
在實現Session Facade時,首先必須決定門面的Session Bean究竟是有狀態的還是無狀態的,這一點必須根據Session Facade為了完成用例請求所要實現的業務過程來決定。
無狀態會話門面 使用stateless session bean 來代表公用的服務流程,這種服務流程只需要執行一次方法調用就能完成服務。因此在設計會話門面前,先對用例和應用場景進行考察。如果用例是無會話的,那么客戶端只需要啟動該用例,調用會話門面上的一個方法即可。方法調用完成了,用例也就完成了。無需在多次方法調用之間保存會話狀態。
有狀態會話門面 使用stateful session bean代表區分個體的,短期的工作流程。這種工作流程需要多次方法調用才能完成任務,在客戶端的多次方法調用之間,必須保存會話狀態。在這種應用場景下,使用有狀態的session bean實現會話門面。
在下面的應用范例中,可以看到session facade本身只包含很少的業務邏輯,他把各種細粒度的交互集中到少數粗粒度的方法中,從而控制客戶端對業務對象的訪問,并且當業務對象的方法改動時,只需要修改Session Bean,而客戶端可以保持不變。這就減少了客戶端和業務對象之間的耦合度,同時客戶端也不必管理事務的細節。
客戶端層:
class clientHelper{
public Object Init(String JNDIName) {
InitialContext cntxt = new InitialContext( );
return cntxt.lookup(JNDIName);
}
public myEjbProxy getProxySession(int UID){
//這里返回會話門面的遠程對象
Object ref=Init(\"java:comp/env/ejb/myEjbProxy\");
myEjbProxyHome myProxyHome= (myEjbProxyHome )PortableRemoteObject.narrow(ref,myEjbProxyHome.class);
return myProxyHome.create(UID);
}
public CartItem getCartItem(int UID){
// 獲得會話門面myEjbProxy,這是一個有狀態的門面
myEjbProxy theproxy = getProxySession(UID);
return theproxy.getCartItem();
}
…
…
}
會話門面:
public class myEjbProxyBean implements SessionBean{
…
…
public CartItem getCartItem(){
//調用實體bean中的方法
}
}
3 并行計算中對Session Facade模式的改進
對分布式系統的特點進一步分析,目前大多數分布式系統(特別是中等粒度或粗粒度的應用)采用的都是常見的并行處理技術,如任務池(task-term)或者分治法(divide and conquer)[6],但是采用這些方法開發系統,處理并行的代碼會和同步、通信處理的代碼緊緊交織在一起,增加了系統的復雜性,更不符合當前可重用軟件松耦合的要求。
原有的會話門面模式作為一種遠程連接的集成抽象,并不能獨自的解決這個問題,不管是有狀態會話還是無狀態會話都需要借助EJB容器具有的集群功能實現并發控制,通過對home-is-clusterable,stateless-bean-is-clusterable,stateless-bean-load-algorithm和 stateless-bean-is-clusterableparameter等參數的設置提供負載平衡的功能。這就大大提高了系統的復雜度,更主要的是這使得系統的并行處理完全依賴于EJB容器,對于那些具有遺留系統的分布式應用程序設計,如何處理會話門面之后的對象的并發訪問就成了問題。在這種情況下,引入了單子模式(Singleton)[5]。
3.1 單子模式(Singleton)
Singleton模式是一種單線程的設計模式,主要作用是保證在Java應用程序中,一個類Class只有一個實例存在,這樣就可以避免并發沖突。singleton能夠被狀態化;這樣,多個單態類在一起就可以作為一個狀態倉庫一樣向外提供服務;另外方面,Singleton也能夠被無狀態化。Singleton類似于全局對象。但是實際上,并不能用全局對象代替Singleton模式,這是因為:其一,大量使用全局對象會使得程序質量降低。其二,全局對象的方法并不能阻止人們將一個類實例化多次:除了類的全局實例外,開發人員仍然可以通過類的構造函數創建類的多個局部實例,從而用于多線程的應用程序。而Singleton模式則通過從根本上控制類的創建,將“保證只有一個實例”這個任務交給了類本身,開發人員不可能再有其他途徑得到類的多個實例。這一點是全局對象方法與Singleton模式的根本區別。使用Singleton可以節省內存,因為他限制了實例的個數,有利于Java垃圾回收(garbage collection)。
3.2 Session Facade模式與Singleton的結合
將單子模式作為Session Facade模式的一個模塊,改進后的Session Facade模式可以稱為DPSF(Distributed Processing Session Facade),模式內包括接口,負責輸入輸出,還包括多個連接,每條連接都可以把他看作是一個singleton的復制(replicate)(見圖3),可以處理一個進程,正好對應于單線程編程的業務對象。門面的接口從客戶端得到輸入,通過負載平衡的算法分配到對應的連接,該連接可能連到其他服務器上的業務對象,也可能是本機上的應用程序,每個連接處理完返回結果到接口,依次傳遞到對應的節點。在工作時,模式內的每條連接都處于循環服務方式(service-loop),通過端口等待輸入,接收到輸入的信息后,將輸入傳遞給對應的Singleton,處理完后從原端口返回結果,創建實例,建立連接(見圖4)。

外部經常通過調用靜態方法Singleton.getInstance( )訪問單態類。用Singleton實現多線程的并發控制,實例延遲初始化(lazy initialization)的創建步驟是個關鍵的問題,通常可將該方法包含在并發處理的代碼中。DPSF中Singleton的實現方法如下:
public class Singleton {
private Singleton( ){ }
//注意這是private 只供內部調用
public static synchronized Singleton getInstance( )
{
if ( instance = = 1 )
{
//多線程應用中的關鍵
instance = new Singleton( );
}
return instance;
}
}
沒有實際訪問該實例的時候,就可以避免創建實例,防止浪費資源。
4 結 語
位于業務層的Session Facade 模式對于用J2EE設計分布式系統非常重要,提高了性能、降低了耦合性、使系統的層次更加清楚,而改進后的DPSF針對并行計算抽象并行處理的技術,并且在艦船綜合后勤保障計算機輔助系統中得到應用,取得很好的效果。他避免了對J2EE服務器過度的依賴,尤其針對具有遺留系統的分布式應用程序的開發具有重要意義,而且作為一種可復用的模式,在改善系統性能的同時,使開發人員僅需提供一些應用專有的程序和節點間傳送數據和結果的通信代碼,大大提高系統開發的效率和可靠性。
參 考 文 獻
[1]曾文,章小芳.基于多設計模式在J2EE項目中的應用研究[J].微計算機應用,2005,26(1):110-112.
[2]許文雨,申曉龍,譚獻海.J2EE設計模式的研究與應用[J].成都信息工程學院學報,2005,20(4):402-406.
[3]Hansen P Brinch.Search for Simplicity:Essays in Parallel Programming[J].IEEE Computer Society Press,1996:422-446.
[4]Deepak Alur,John Crupi,Dan Malks.Core J2EE(tm)Patterns:Best Practices and Design Strategies\\[M\\].Second Edition.Prentice Hall PTR,2003.
[5]Erich Gamma,Richard Helms,Ralph Johnson,et al.Design Patterns:Elements of Reusable Object-Oriented Design [M].Addison-Wesley,1995.
[6]Andrews G,Schneider F B.Concepts and Notations for Concurrent Programming[J].ACM Computing Surveys,1983,15(1).
作者簡介 石 亮 女,1981年出生,江蘇鎮江人,助教。主要從事軟件工程理論與應用的研究。