kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks
          http://www.weste.net/html/200310/20031029QBI124658.html


          EJB 2.1中的新特性主要集中于有關(guān)SOAP和WSDL的Web服務(wù),包括兩種新推出的Web服務(wù)應(yīng)用程序接口(JAX-RPC和JAXM)。它們可以用來(lái)與其他Web服務(wù)模塊通信,并適當(dāng)?shù)卦赪eb模塊中運(yùn)用無(wú)狀態(tài)的bean和消息驅(qū)動(dòng)bean。也就是說(shuō),基于新的標(biāo)準(zhǔn),EJB將逐漸成為Web服務(wù)的開發(fā)平臺(tái)。

          在支持Web服務(wù)的同時(shí),EJB 2.1也改進(jìn)了EJB-QL以及消息驅(qū)動(dòng)bean(MDB)的編程模型。該編程模型目前已經(jīng)擴(kuò)展至Java消息服務(wù)之上以支持任何一種消息系統(tǒng)。另外,新標(biāo)準(zhǔn)也推出了一種新的計(jì)時(shí)器服務(wù),使得開發(fā)人員可以設(shè)計(jì)計(jì)時(shí)事件,并提供消息聯(lián)接的接口,供開發(fā)人員在組件之間控制消息的流動(dòng)之用。

          這里我們并不討論每個(gè)特性的太多細(xì)節(jié),只是想做一簡(jiǎn)單的介紹,起到拋磚引玉的作用。如果讀者有興趣,可以參閱EJB 2.1的相關(guān)規(guī)格說(shuō)明。下面我們就Web服務(wù)、MDB編程模型和EJBQL三個(gè)方面分別加以說(shuō)明如下:

          (一) 對(duì)于Web服務(wù)的支持

          EJB 2.1新標(biāo)準(zhǔn)推出的最大原動(dòng)力就是對(duì)于Web服務(wù)的支持。EJB 2.1允許編程人員利用無(wú)狀態(tài)的會(huì)話bean和消息驅(qū)動(dòng)bean來(lái)開發(fā)基于SOAP的Web服務(wù),并使得基于SOAP 1.1的用戶可以使用相關(guān)的服務(wù)。

          應(yīng)該說(shuō)明的是,基于其他Web服務(wù)平臺(tái)的SOAP客戶通常無(wú)法激活無(wú)狀態(tài)的會(huì)話 bean的方法,例如MS.NET,PERL,Apache Axis。而在EJB 2.1中的Web服務(wù)接口則提供了一個(gè)前所未有的跨平臺(tái)兼容性。

          EJB 2.1中Web服務(wù)接口是基于兩個(gè)新推出的J2EE SOAP技術(shù)的,即JAX-RPC和JAXM。

          1、JAX-RPC和EJB

          JAX-RPC,即Java API for XML-RPC,是基于SOAP的Java RMI技術(shù)的。它與以前的 Java RMI技術(shù)和Java-RMI IIOP技術(shù)類似,不同之處是使用了SOAP作為底層協(xié)議。

          實(shí)現(xiàn)JAX-RPC的系統(tǒng)必須支持HTTP之上的RPC編碼機(jī)制,另外也應(yīng)該支持其他的編碼機(jī)制、消息格式和互聯(lián)網(wǎng)協(xié)議。各種EJB,包括會(huì)話bean、實(shí)體bean和消息驅(qū)動(dòng)bean都可以使用JAX-RPC技術(shù)來(lái)激活Web服務(wù)的操作。比如說(shuō),一個(gè)無(wú)狀態(tài)的會(huì)話bean就可以利用JAX-RPC來(lái)調(diào)用.NET Web服務(wù)的方法(見下圖1)。

           

          圖1 JAX-RPC 和 EJB


          JAX-RPC同樣也是一種新的組件接口的開發(fā)基礎(chǔ),這種接口稱為終點(diǎn)(endpoint)接口,它允許一個(gè)無(wú)狀態(tài)的會(huì)話bean作用為一個(gè)Web服務(wù)組件。終點(diǎn)接口實(shí)現(xiàn)了javax.rmi.Remote接口并遵循JAX-RPC的協(xié)議標(biāo)準(zhǔn)。其中,將一個(gè)無(wú)狀態(tài)的會(huì)話bean作為Web組件來(lái)部署的過(guò)程并不是很復(fù)雜,開發(fā)人員只需要定義bean的類文件及遠(yuǎn)程接口,并將其部署至相關(guān)的應(yīng)用程序中。一旦Web服務(wù)的組件部署成功后,其方法可以被任何一個(gè)遵循SOAP協(xié)議的組件調(diào)用,而無(wú)論組件是基于何種開發(fā)語(yǔ)言或開發(fā)平臺(tái)的,如.NET,PERL,Apache Axis,C,C++及其他(見下圖2)。

           

          圖2 通過(guò)SOAP和其他Web服務(wù)器通信


          2、JAXM和EJB

          JAXM(Java API for XML Messaging)是一種類似于JMS(Java Message Service,Java消息服務(wù))的消息通信的應(yīng)用程序接口。JMS是一種用于在面向消息的中間件之上發(fā)送和接收消息的應(yīng)用程序接口,而JAXM則是在Web服務(wù)中傳遞消息的應(yīng)用程序接口。因?yàn)樗饕詡鬏敾赬ML文件的SOAP消息為主,所以可以說(shuō)JAXM是面向文檔的。JAXM用戶利用SAAJ(SOAP with Attachments API forJava)集成,接收和管理SOAP消息,其中SAAJ主要是用來(lái)管理SOAP消息中的XML結(jié)構(gòu)。

          JAXM技術(shù)與上面所說(shuō)的JAX-RPC存在很大的不同,后者主要使用方法調(diào)用的機(jī)制,并在Java RMI代理(proxy)之間隱藏SOAP消息。基于JAX-RPC技術(shù),開發(fā)人員只會(huì)看見遠(yuǎn)程接口,即方法、參數(shù)和返回值。而在JAXM的作用下,開發(fā)人員將直接處理SOAP協(xié)議并開發(fā)自己專用的SOAP消息。類似于JAX-RPC,JAXM可以用來(lái)與任何遵循SOAP開發(fā)的Web服務(wù)組件交換SOAP消息。比如說(shuō),一個(gè)enterprise bean可以利用JAXM來(lái)與用PERL開發(fā)的Web服務(wù)交換SOAP消息。

          現(xiàn)在一些EJB 2.1開發(fā)人員推薦使用JAXM作為開發(fā)新的消息驅(qū)動(dòng)bean的基礎(chǔ),即基于JAXM的消息驅(qū)動(dòng)bean(JAXM-based message-driven bean,JAXM-MDB)。JAXM-MDB可以傳輸SOAP消息并作用為Web服務(wù)的組件。基于JAXM-MDB,開發(fā)人員可以實(shí)現(xiàn)單工的消息傳輸接口,或雙工,即可接收可發(fā)送的消息傳輸接口(見下圖3)。就目前來(lái)說(shuō),因?yàn)橄Ⅱ?qū)動(dòng)bean組件可以廣泛用到任意類型的消息系統(tǒng),這種想法應(yīng)該是可行的。

          JAX-RPC和JAXM可以允許enterprise bean來(lái)訪問其他平臺(tái)的Web服務(wù),并利用無(wú)狀態(tài)的會(huì)話bean和消息驅(qū)動(dòng)bean來(lái)開發(fā)相應(yīng)的Web服務(wù)模塊。這些應(yīng)用程序接口是相對(duì)靈活的,適合于將EJB模塊擴(kuò)展為Web服務(wù)框架。

           

          圖3 JAXM-MDB


          (二)擴(kuò)展消息驅(qū)動(dòng)bean

          EJB 2.0引進(jìn)了消息驅(qū)動(dòng)bean,可以處理遵循JMS多方的異步消息。基于消息驅(qū)動(dòng)bean,J2EE平臺(tái)可以利用異步消息機(jī)制,并改變了服務(wù)器編程的體系結(jié)構(gòu)。

          EJB 2.1將基于JMS的消息驅(qū)動(dòng)bean編程模型擴(kuò)展為其他消息系統(tǒng)。基于EJB2.1開發(fā)的應(yīng)用系統(tǒng)仍必須支持基于JMS的消息驅(qū)動(dòng)bean(JMS-MDB),當(dāng)然也支持其他類型的消息系統(tǒng)。比如說(shuō),一個(gè)Web服務(wù)模塊可以支持基于JAXM的消息驅(qū)動(dòng)bean,該模塊也可以支持SMTP信件協(xié)議、SNMP的設(shè)備控制、peer對(duì)peer的協(xié)議。另外,消息驅(qū)動(dòng)bean也可以作為連接相關(guān)OLTP系統(tǒng)如CICS,IMS,openUTM的橋梁。

          另外還要說(shuō)明一點(diǎn),由于新推出的消息驅(qū)動(dòng)bean組件是基于J2EE連接器體系結(jié)構(gòu)的(Java Connector Architecture,JCA1.5),所以該組件具有在消息系統(tǒng)之間良好的移植性。JCA 1.5通常是用于定義商業(yè)信息系統(tǒng)中的可移植程序模型。比如說(shuō),開發(fā)人員可以利用JCA 1.5定義一個(gè)基于SMTP的消息驅(qū)動(dòng)bean,而該bean是可以在所有遵循EJB 2.1標(biāo)準(zhǔn)的服務(wù)器上移植的(如下圖4)。

           

          圖4 JCA 1.5


          1、目標(biāo)鏈接(destination linking)

          EJB 2.1另外一個(gè)新特性就是目標(biāo)鏈接。簡(jiǎn)單地說(shuō),EJB容器可以將一個(gè)消息服務(wù)的輸出傳送至另一個(gè)消息驅(qū)動(dòng)bean的輸入,即新目標(biāo)。

          比如說(shuō),一個(gè)無(wú)狀態(tài)的會(huì)話bean可以使用JMS發(fā)送一條異步消息到相應(yīng)的目標(biāo),而在部署應(yīng)用系統(tǒng)的時(shí)候,開發(fā)人員可以將該目標(biāo)連接到一個(gè)部署在同一個(gè)EJB容器的消息驅(qū)動(dòng)bean。也就是說(shuō),開發(fā)人員可以使用目標(biāo)鏈接技術(shù)在部署期間定義消息流動(dòng),從而在商業(yè)平臺(tái)描述完整的工作流。

          2、定時(shí)器服務(wù)機(jī)制

          定時(shí)器服務(wù)機(jī)制是一個(gè)在EJB容器開發(fā)的調(diào)度系統(tǒng)。一個(gè)無(wú)狀態(tài)的會(huì)話bean或?qū)嶓wbean可以在相應(yīng)的定時(shí)器中登記,從而在未來(lái)一定的時(shí)間點(diǎn)被定時(shí)器通知。

          定時(shí)器服務(wù)機(jī)制使用的是一個(gè)簡(jiǎn)單的程序框架。作為其基礎(chǔ)的無(wú)狀態(tài)的會(huì)話bean 或?qū)嶓wbean必須實(shí)現(xiàn)
          TimedObject接口:
              public interface javax.ejb.TimedObject{
              public void ejbTimeout(Timer timer);
              }


          當(dāng)一個(gè)bean的相關(guān)時(shí)間點(diǎn)到達(dá)的時(shí)候,容器將會(huì)調(diào)用定時(shí)器的ejbTimeout()方法在這個(gè)方法中,開發(fā)人員將根據(jù)需求定義其應(yīng)用邏輯。 比如說(shuō),一個(gè)關(guān)于用戶信息的實(shí)體bean具有一個(gè)每隔60天觸發(fā)的定時(shí)器,以用來(lái)提醒用戶應(yīng)該修改密碼。這樣的話,每隔60天,EJB容器就會(huì)調(diào)用該定時(shí)器的ejbTimeout()方法,而這個(gè)實(shí)體bean就會(huì)向相關(guān)的mailer模塊發(fā)送一條JMS消息,后者將會(huì)向用戶的電子信箱發(fā)送要求修改密碼的email。Timer對(duì)象還具有一些其他特性,比如可以取消一個(gè)已定的定時(shí)器,查詢?cè)谟|發(fā)之前還有多少時(shí)間等。另外,開發(fā)人員還可以將一個(gè)定時(shí)器對(duì)象聯(lián)系到一個(gè)可序列化的對(duì)象,從而在定時(shí)器中存儲(chǔ)一些與應(yīng)用相關(guān)的信息。當(dāng)定時(shí)器響應(yīng)的時(shí)候,開發(fā)人員可以訪問一定的應(yīng)用信息并決定如何處理相關(guān)的時(shí)間。

          EJB可以通過(guò)TimerService接口來(lái)訪問EJB容器的定時(shí)器服務(wù),也就是說(shuō)實(shí)體bean和會(huì)話bean必須使用該接口來(lái)設(shè)定它們自己的定時(shí)器。為了達(dá)到這一目的,bean必須首先調(diào)用EJBContext.getTimerService()方法的程序示例如下:

          ……    
              public interface javax.ejb.TimerService{
              public Timer createTimer(java.util.Date expiration,
              java.iO.Serializable info);
              public Timer createTimer(java.util.Date initialExpiration,
              long intervalDuration,java.io.Serializable info);
              public Timer createTimer(long duration,
              java.io.Serializable info);
              public Timer createTimer(long initialDuration,
              long intervalDuration,
              java.io.Serializable info);
              public Collection getTimers();
              }
             ……


          在一些情況下,開發(fā)人員只需要定時(shí)器在特定的時(shí)間響應(yīng)一次,而在其他一些情況下,則需要定時(shí)器間隔一定時(shí)間持續(xù)響應(yīng)。比方說(shuō),上面我們提到的ejb就會(huì)每隔60天提醒用戶,也就是每隔60天的時(shí)間間隔就會(huì)響應(yīng)一次。

          一個(gè)無(wú)狀態(tài)的會(huì)話bean或是實(shí)體bean可以設(shè)定多個(gè)定時(shí)器,但是一般來(lái)說(shuō)它們都是由相同的ejbTimeout方法管理的。這種方法也可以使用可序列化的對(duì)象來(lái)區(qū)分不同的定時(shí)器。

          (三)EJBQL的提高

          EJB 2.1也包括兩項(xiàng)對(duì)于EJBQL的提高,即order by語(yǔ)句的加入和一些新函數(shù)。

          1、order by語(yǔ)句

          以前的EJB規(guī)格描述中并沒有包含order by語(yǔ)句,而在EJB 2.1中,EJBQL已經(jīng)開始支持order by語(yǔ)句的應(yīng)用了。比如說(shuō)開發(fā)人員可以設(shè)計(jì)一個(gè)數(shù)據(jù)庫(kù)用戶信息查詢,并將查詢結(jié)果按照用戶的系統(tǒng)ID排序:

          SELECT OBJECT(I)
            FROM Users as I
            ORDER BY UID


          order by語(yǔ)句通常會(huì)寫在EJB遠(yuǎn)程或本地接口的查找(finder)或選擇(select)語(yǔ)句中。通常來(lái)說(shuō)在order by語(yǔ)句的標(biāo)識(shí)符(identifier)都是路徑表達(dá)式(path expression),并以容器管理的持久性變量結(jié)束。這里需要說(shuō)明的是,order by語(yǔ)句只能應(yīng)用于相關(guān)ejb的容器管理的持久性變量。在order by語(yǔ)句中,開發(fā)人員也可以使用DESC或ASC來(lái)指定排列結(jié)果時(shí)下降或上升的次序,其中上升次序是缺省值。

          開發(fā)人員也可以在select方法中,即選出持久性變量時(shí)使用order by語(yǔ)句。在下面的例子中,該查詢選出了具有特定住址的用戶,并按照姓名排序:

          SELECT DISTINCT I.customer.name
          FROM Customer as I
              WHERE I.city=NanJing
              ORDER BY I.customer.name


          當(dāng)一個(gè)EJBQL查詢選出持續(xù)性變量時(shí),order by值應(yīng)用于在該選出語(yǔ)句(select)出現(xiàn)的持續(xù)性變量。比如說(shuō),在上例中,開發(fā)人員無(wú)法先選出用戶的姓名,而是使用用戶的年齡進(jìn)行排序。

          2.新功能

          新的EJBQL對(duì)于where語(yǔ)句和select語(yǔ)句都加入了一些新的函數(shù)。 在where語(yǔ)句中,除了已有的concat,substring,locate,length,abs和sqrt函數(shù),EJB2.1加入了mod函數(shù)。

          EJB 2.1也同時(shí)向select語(yǔ)句中加入了5個(gè)新的集合類函數(shù):AVG,COUNT,MAX,MIN和SUM,這些函數(shù)的功能都和SQL-92中相應(yīng)的定義類似。不同的是,AVG和SUM只作用于數(shù)字類型,而COUNT,MAX和MIN函數(shù)則作用于任意一個(gè)容器管理的持久性變量,包括日期類型和字符串類型。Count則可以應(yīng)用于一個(gè)容器管理的持久性變量或是EJB標(biāo)識(shí)符。

          比方說(shuō),我們可以定義一個(gè)查詢,以得到所有住在南京的用戶。這里COUNT函數(shù)直接地作用在標(biāo)識(shí)符上,而無(wú)需OBJECT()操作:

          SELECT COUNT(C)
              FROM Customer as C
              WHERE C.city=NanJing
              下面的例子中,我們可以得到用戶工資的總和:
              SELECT SUM(C.totalsalary)
              FROM Customer as C
              WHERE C.city=NanJing


          以上我們簡(jiǎn)要地介紹了EJB 2.1中的新特性,包括Web服務(wù)、消息驅(qū)動(dòng)bean和 EJBQL等方面的提高,有興趣的讀者也可以參照最新的EJB規(guī)范描述來(lái)進(jìn)一步研究和實(shí)踐。

          posted on 2005-03-29 10:51 笨笨 閱讀(215) 評(píng)論(0)  編輯  收藏 所屬分類: J2EEALL
          主站蜘蛛池模板: 宜宾市| 壶关县| 泰州市| 共和县| 泽库县| 洞头县| 桑植县| 云林县| 五峰| 奉化市| 宁乡县| 平远县| 桑植县| 东至县| 尚志市| 教育| 河东区| 岑巩县| 星子县| 克山县| 富源县| 漠河县| 香港 | 碌曲县| 湖南省| 琼海市| 金堂县| 攀枝花市| 嘉义市| 漳浦县| 筠连县| 伊金霍洛旗| 乐东| 江阴市| 遂川县| 武冈市| 宾川县| 清镇市| 娱乐| 图片| 波密县|