韓亦笳 趙 斌
摘要:EJB技術(shù)是J2EE平臺(tái)的核心技術(shù),繼承了Java語(yǔ)言的平臺(tái)無(wú)關(guān)性的特點(diǎn),簡(jiǎn)化了用Java開發(fā)分布式組件應(yīng)用程序的過(guò)程。分布式系統(tǒng)體系結(jié)構(gòu)具有安全性、穩(wěn)定性、易維護(hù)、快速響應(yīng)和擴(kuò)展靈活等特點(diǎn),用來(lái)構(gòu)建具有分布式需求的企業(yè)物流系統(tǒng)非常合適。文章介紹了EJB技術(shù)如何實(shí)現(xiàn)分布式計(jì)算功能,描述了分布式企業(yè)物流系統(tǒng)的設(shè)計(jì)方案,提出了改進(jìn)系統(tǒng)性能的幾種方法,最后討論了EJB安全性的相關(guān)內(nèi)容。
關(guān)鍵詞:EJB;分布式;組件:物流系統(tǒng)
0引言
如今,一體化物流是最具影響力的物流發(fā)展趨勢(shì)之一。電子商務(wù)的快速發(fā)展使得構(gòu)建一體化物流系統(tǒng)成為可能。同時(shí),EBXML、UDDI、XML/EDI等電子商務(wù)技術(shù)的迅速發(fā)展,使得企業(yè)之間的信息交互和業(yè)務(wù)互操作有了標(biāo)準(zhǔn)的規(guī)范和方法,為一體化物流系統(tǒng)的建設(shè)奠定了基礎(chǔ)。
SUN公司推出的J2EE企業(yè)平臺(tái)為現(xiàn)代企業(yè)應(yīng)用提供了分布式系統(tǒng)體系結(jié)構(gòu)的解決方案。J2EE不僅繼承了Java語(yǔ)言的平臺(tái)無(wú)關(guān)性的特點(diǎn),而且還結(jié)合了組件技術(shù),為現(xiàn)代企業(yè)快速創(chuàng)建分布式應(yīng)用提供了一體化的解決方案。EJB即Enterprise JavaBeans,是一種服務(wù)器端組件體系結(jié)構(gòu),它簡(jiǎn)化了用Java開發(fā)企業(yè)級(jí)的分布式組件應(yīng)用程序的過(guò)程;通過(guò)EJB可以開發(fā)可擴(kuò)展的、健壯的和安全的應(yīng)用程序,而不用編寫復(fù)雜的分布式組件框架;利用EJB可以快速而且輕松地利用Java構(gòu)建服務(wù)器端組件;EJB被設(shè)計(jì)為支持應(yīng)用程序的可移植性和可重用性。這些特性使得EJB可以適用于為任何廠商的企業(yè)中間件服務(wù)。
本文介紹了基于EJB技術(shù)的分布式企業(yè)物流系統(tǒng)的設(shè)計(jì)方案,對(duì)物流系統(tǒng)運(yùn)行初期所遇到的部分性能瓶頸給出了解決辦法,并且分析了EJB的安全性。
1EJB技術(shù)實(shí)現(xiàn)分布式計(jì)算
EJB的核心是RMI,即Remote Method Invocation。在EJB中,對(duì)客戶端來(lái)說(shuō)企業(yè)Bean必須可見,客戶端才能調(diào)用。而這正是通過(guò)Java RMI來(lái)實(shí)現(xiàn)的。企業(yè)Bean并不是完整的遠(yuǎn)程對(duì)象,它們沒(méi)有繼承UnicastRemoteObject,而是包裝在RMI功能的外殼內(nèi),叫做EJB對(duì)象。EJB對(duì)象正是客戶端訪問(wèn)的遠(yuǎn)程對(duì)象。當(dāng)一個(gè)客戶端調(diào)用EJB對(duì)象時(shí),EJB對(duì)象將遠(yuǎn)程調(diào)用請(qǐng)求委派給企業(yè)Bean執(zhí)行。
如果開發(fā)企業(yè)Bean,就需要Bean的EJB對(duì)象的接口,稱為遠(yuǎn)程接口。遠(yuǎn)程接口復(fù)制了企業(yè)Bean的所有的方法,調(diào)用EJB對(duì)象就好象在調(diào)用企業(yè)Bean本身一樣。
EJB的遠(yuǎn)程接口也有自己的一些特性:EJB遠(yuǎn)程接口間接地繼承了java.rmi.Remote接口;EJB遠(yuǎn)程接口中的每個(gè)方法都需要拋出java.rmi.RemoteException異常;每個(gè)遠(yuǎn)程接口中的方法都必須接收符合Java RMI標(biāo)準(zhǔn)類型的參數(shù)。參數(shù)可以是原始類型、可序列化或是遠(yuǎn)程對(duì)象;可以在語(yǔ)法上控制它是值調(diào)用還是引用調(diào)用。
客戶端使用的EJB對(duì)象可以是真正的EJB對(duì)象,也可以是在網(wǎng)絡(luò)上某個(gè)地方的EJB對(duì)象的遠(yuǎn)程存根(RemoteStub);客戶端代碼不關(guān)心這些,因?yàn)樗皇钦{(diào)用EJB對(duì)象接口,而不管它是對(duì)象本身還是存根的具體實(shí)現(xiàn)。因此EJB的本地,遠(yuǎn)程位置透明性通過(guò)RMI就達(dá)到了。
在EJB中,Home對(duì)象是產(chǎn)生EJB對(duì)象的工廠。通過(guò)Java命名目錄服務(wù)接口(JNDI)來(lái)查找Home對(duì)象,一旦找到了Home對(duì)象,就可以通過(guò)RMI來(lái)調(diào)用它。
Home對(duì)象的接口(也就是Home接口)也是個(gè)Java遠(yuǎn)程接口,符合Java RMI規(guī)范。它必須拋出遠(yuǎn)程異常,實(shí)現(xiàn)Java.rmi.Remote并介紹系列化參數(shù)。作為EJB對(duì)象,它們是各個(gè)容器私有的。
本地對(duì)象的客戶端只和本地接口交互,就好像遠(yuǎn)程對(duì)象的客戶端只處理遠(yuǎn)程接口一樣。和EJB對(duì)象一樣,對(duì)本地對(duì)象的引用可以是一個(gè)實(shí)際的本地對(duì)象,也可以是位于網(wǎng)絡(luò)某個(gè)地方的本地對(duì)象的遠(yuǎn)程存根。
EJB的調(diào)用過(guò)程如圖1所示。
2系統(tǒng)設(shè)計(jì)方案
E3B是J2EE平臺(tái)的核心,也是J2EE得到業(yè)界廣泛關(guān)注和支持的主要原因。J2EE的一個(gè)主要目的就是簡(jiǎn)化企業(yè)應(yīng)用系統(tǒng)的開發(fā),使開發(fā)人員將主要精力放在商業(yè)邏輯的開發(fā)上。EJB正是基于這種思想的服務(wù)器端技術(shù),它本身也是一種規(guī)范,該規(guī)范定義了一個(gè)可重用的組件框架來(lái)實(shí)現(xiàn)分布式的、面向?qū)ο蟮纳虡I(yè)邏輯。EJB的核心思想是將商業(yè)邏輯與底層的系統(tǒng)邏輯分開,使開發(fā)人員只需關(guān)心商業(yè)邏輯,而由EJB容器實(shí)現(xiàn)目錄服務(wù)、事務(wù)處理、持久性、安全性等底層系統(tǒng)邏輯。
本文所述的分布式企業(yè)物流系統(tǒng)采用EJB體系結(jié)構(gòu),由客戶層、應(yīng)用邏輯層、數(shù)據(jù)層組成的。客戶層為用戶提供簡(jiǎn)潔、友好的人機(jī)交互界面,主要負(fù)責(zé)數(shù)據(jù)的錄入和輸出數(shù)據(jù)的表示。當(dāng)用戶進(jìn)行數(shù)據(jù)交換時(shí),其應(yīng)用程序不直接訪問(wèn)第三層的數(shù)據(jù)庫(kù)服務(wù)器,而是通過(guò)第二層——應(yīng)用邏輯層提供的接口間接訪問(wèn)后臺(tái)的數(shù)據(jù)庫(kù),這樣就保證了后臺(tái)數(shù)據(jù)庫(kù)的安全性,實(shí)現(xiàn)真正意義上的“瘦客戶”模式。系統(tǒng)體系結(jié)構(gòu)如圖2所示。
數(shù)據(jù)層實(shí)際上就是后臺(tái)的數(shù)據(jù)庫(kù)管理系統(tǒng),應(yīng)用邏輯層可以通過(guò)JDBC與后臺(tái)數(shù)據(jù)庫(kù)進(jìn)行通信。
應(yīng)用邏輯層是整個(gè)系統(tǒng)的核心,它集中了整個(gè)應(yīng)用的所有規(guī)則,負(fù)責(zé)接收客戶層發(fā)送過(guò)來(lái)的請(qǐng)求,對(duì)輸入的數(shù)據(jù)按照既定的業(yè)務(wù)規(guī)則進(jìn)行加工處理,并轉(zhuǎn)換為對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。因此,應(yīng)用邏輯層是客戶層訪問(wèn)后臺(tái)數(shù)據(jù)庫(kù)的代理。
分布式物流系統(tǒng)中各類事務(wù)(即物流系統(tǒng)的事務(wù)模塊)的主要邏輯可以被放置在EJB中。以這種方式,我們就可以使代碼集中,模塊化地解決事務(wù)問(wèn)題,利用企Bean容器來(lái)支持低層服務(wù),比如狀態(tài)管理、事務(wù)處理、線程管理、遠(yuǎn)程數(shù)據(jù)訪問(wèn)和安全等。
在本文所述的物流系統(tǒng)中,貨物跟蹤、車船跟蹤、運(yùn)力調(diào)度等模塊都用EJB實(shí)現(xiàn),他們各自成為獨(dú)立的組件,企業(yè)的各部門、分公司可以根據(jù)權(quán)限訪問(wèn)這些組件,實(shí)時(shí)查看貨物狀態(tài)、車船位置及運(yùn)力的分配情況,從而實(shí)現(xiàn)物流系統(tǒng)的分布式和組件式管理。
客戶層開發(fā)的主要思想是合理劃分?jǐn)?shù)據(jù)敏感組件和不敏感組件,分別形成靜態(tài)網(wǎng)頁(yè)和動(dòng)態(tài)EJB組件,以利于應(yīng)用程序的管理和維護(hù),這樣編程人員可以非常方便地保持客戶端和服務(wù)器端數(shù)據(jù)一致??蛻舳藨?yīng)用程序本身不與后臺(tái)數(shù)據(jù)庫(kù)服務(wù)器直接連接,而是通過(guò)調(diào)用應(yīng)用邏輯層的組件與后臺(tái)數(shù)據(jù)庫(kù)服務(wù)器發(fā)生聯(lián)系,用于客戶錄入數(shù)據(jù)和顯示從服務(wù)器端返回的各種查詢結(jié)果和各種統(tǒng)計(jì)報(bào)表。
3系統(tǒng)性能改進(jìn)
在系統(tǒng)的運(yùn)行初期,碰到了部分性能瓶頸,主要解決方法如下:
(1)一次性查詢大量數(shù)據(jù)時(shí),系統(tǒng)性能下降,這是由于實(shí)體bean反復(fù)調(diào)用數(shù)據(jù)庫(kù)引起的。使用會(huì)話Bean來(lái)處理數(shù)據(jù)庫(kù)的批量操作可以減少數(shù)據(jù)庫(kù)調(diào)用次數(shù),從而提高性能。
(2)采用集群來(lái)提升系統(tǒng)性能。集群中的每臺(tái)應(yīng)用服務(wù)器都含有相同的EJB,采用有效的算法可實(shí)現(xiàn)負(fù)載均衡。
(3)調(diào)整服務(wù)器的線程池大小、JVM堆棧大小、連接數(shù)等屬性,可達(dá)到最優(yōu)配置。
4EJB的安全性分析
EJB的安全架構(gòu)主要有兩種,分別是聲明性安全架構(gòu)和編程安全架構(gòu)。
聲明性安全架構(gòu)是指由部署員建立與J2EE應(yīng)用程序關(guān)聯(lián)的容器強(qiáng)制的訪問(wèn)控制規(guī)則的架構(gòu)。它是部署員使用部署工具將應(yīng)用程序權(quán)限模型映射到特定于操作環(huán)境的策略和機(jī)制。應(yīng)用程序權(quán)限模型在部署描述符中定義。
編程安全架構(gòu)是指EJB容器先做出訪問(wèn)控制決定,再將方法調(diào)用指派給組件的架構(gòu)。組件的邏輯或狀態(tài)不包括這些訪問(wèn)決定。但是一個(gè)組件可以使用兩種方法執(zhí)行細(xì)化訪問(wèn)控制——EJBContext.isCallerlnRole(供企業(yè)Bean代碼使用)和HttpServletRequest.isUserlnRole(供Web組件使用)。組件根據(jù)調(diào)用參數(shù)、組件的內(nèi)部狀態(tài)或其他因素,使用上述方法確定是否將組件選擇的權(quán)限授予調(diào)用者。
聲明性安全架構(gòu)和編程安全架構(gòu)在實(shí)際應(yīng)用中可以互為補(bǔ)充。在編寫完應(yīng)用程序之后,聲明性安全更加靈活。在編寫應(yīng)用程序中,編程安全可以提供更加靈活的功能。此外,對(duì)于部署員而言,聲明性安全是透明且完全可理解的;而編程安全卻隱含在應(yīng)用程序中,可能只有應(yīng)用程序開發(fā)人員才能完全理解。在為特定組件和方法選擇安全架構(gòu)過(guò)程中,應(yīng)該考慮兩者的區(qū)別。
5結(jié)束語(yǔ)
分布式系統(tǒng)體系結(jié)構(gòu)具有安全性、穩(wěn)定性、易維護(hù)、快速響應(yīng)和擴(kuò)展靈活等特點(diǎn),用來(lái)構(gòu)建具有分布式需求的企業(yè)物流系統(tǒng)非常合適。EJB作為優(yōu)秀的分布式架構(gòu),可以簡(jiǎn)化開發(fā)分布式應(yīng)用程序的過(guò)程,從而開發(fā)出可重用的具有高度可移植性的應(yīng)用程序。