kapok

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks
          <2005年6月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(28)

          隨筆分類

          隨筆檔案

          Corba

          EAI

          Online Document

          Open Source

          Portal

          RSS Links

          Weblogic

          不錯的鏈接

          工具集合

          數據倉庫相關

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          解析J2EE1.4新特性(4) - EJB2.1的新特性
          務實
          14/1/2005
          URL: http://www.zdnet.com.cn/developer/code/story/0,3800066897,39176622,00.htm

          EJB 2.1中的新特性主要集中于有關SOAP和WSDL的Web服務,包括兩種新推出的Web服務應用程序接口(JAX-RPC和JAXM)。它們可以用來與其他Web服務模塊通信,并適當地在Web模塊中運用無狀態的bean和消息驅動bean。也就是說,基于新的標準,EJB將逐漸成為Web服務的開發平臺。

          在支持Web服務的同時,EJB 2.1也改進了EJB-QL以及消息驅動bean(MDB)的編程模型。該編程模型目前已經擴展至Java消息服務之上以支持任何一種消息系統。另外,新標準也推出了一種新的計時器服務,使得開發人員可以設計計時事件,并提供消息聯接的接口,供開發人員在組件之間控制消息的流動之用。

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

          一) 對于Web服務的支持

          EJB 2.1新標準推出的最大原動力就是對于Web服務的支持。EJB 2.1允許編程人員利用無狀態的會話bean和消息驅動bean來開發基于SOAP的Web服務,并使得基于SOAP 1.1的用戶可以使用相關的服務。

          應該說明的是,基于其他Web服務平臺的SOAP客戶通常無法激活無狀態的會話 bean的方法,例如MS.NET,PERL,Apache Axis。而在EJB 2.1中的Web服務接口則提供了一個前所未有的跨平臺兼容性。

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

          1、JAX-RPC和EJB

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

            實現JAX-RPC的系統必須支持HTTP之上的RPC編碼機制,另外也應該支持其他的編碼機制、消息格式和互聯網協議。各種EJB,包括會話bean、實體bean和消息驅動bean都可以使用JAX-RPC技術來激活Web服務的操作。比如說,一個無狀態的會話bean就可以利用JAX-RPC來調用.NET Web服務的方法(見下圖4)。

          圖4 JAX-RPC 和 EJB

           

           JAX-RPC同樣也是一種新的組件接口的開發基礎,這種接口稱為終點(endpoint)接口,它允許一個無狀態的會話bean作用為一個Web服務組件。終點接口實現了javax.rmi.Remote接口并遵循JAX-RPC的協議標準。其中,將一個無狀態的會話bean作為Web組件來部署的過程并不是很復雜,開發人員只需要定義bean的類文件及遠程接口,并將其部署至相關的應用程序中。一旦Web服務的組件部署成功后,其方法可以被任何一個遵循SOAP協議的組件調用,而無論組件是基于何種開發語言或開發平臺的,如.NET,PERL,Apache Axis,C,C++及其他(見下圖5)。

          圖5 通過SOAP和其他Web服務器通信

          2、JAXM和EJB

            JAXM(Java API for XML Messaging)是一種類似于JMS(Java Message Service,Java消息服務)的消息通信的應用程序接口。JMS是一種用于在面向消息的中間件之上發送和接收消息的應用程序接口,而JAXM則是在Web服務中傳遞消息的應用程序接口。因為它主要以傳輸基于XML文件的SOAP消息為主,所以可以說JAXM是面向文檔的。JAXM用戶利用SAAJ(SOAP with Attachments API forJava)集成,接收和管理SOAP消息,其中SAAJ主要是用來管理SOAP消息中的XML結構。

            JAXM技術與上面所說的JAX-RPC存在很大的不同,后者主要使用方法調用的機制,并在Java RMI代理(proxy)之間隱藏SOAP消息?;贘AX-RPC技術,開發人員只會看見遠程接口,即方法、參數和返回值。而在JAXM的作用下,開發人員將直接處理SOAP協議并開發自己專用的SOAP消息。類似于JAX-RPC,JAXM可以用來與任何遵循SOAP開發的Web服務組件交換SOAP消息。比如說,一個enterprise bean可以利用JAXM來與用PERL開發的Web服務交換SOAP消息。

            現在一些EJB 2.1開發人員推薦使用JAXM作為開發新的消息驅動bean的基礎,即基于JAXM的消息驅動bean(JAXM-based message-driven bean,JAXM-MDB)。JAXM-MDB可以傳輸SOAP消息并作用為Web服務的組件。基于JAXM-MDB,開發人員可以實現單工的消息傳輸接口,或雙工,即可接收可發送的消息傳輸接口(見下圖6)。就目前來說,因為消息驅動bean組件可以廣泛用到任意類型的消息系統,這種想法應該是可行的。

            JAX-RPC和JAXM可以允許enterprise bean來訪問其他平臺的Web服務,并利用無狀態的會話bean和消息驅動bean來開發相應的Web服務模塊。這些應用程序接口是相對靈活的,適合于將EJB模塊擴展為Web服務框架。

          圖6 JAXM-MDB

           

          二)擴展消息驅動bean

             EJB 2.0引進了消息驅動bean,可以處理遵循JMS多方的異步消息?;谙Ⅱ寗觔ean,J2EE平臺可以利用異步消息機制,并改變了服務器編程的體系結構。

            EJB 2.1將基于JMS的消息驅動bean編程模型擴展為其他消息系統?;贓JB2.1開發的應用系統仍必須支持基于JMS的消息驅動bean(JMS-MDB),當然也支持其他類型的消息系統。比如說,一個Web服務模塊可以支持基于JAXM的消息驅動bean,該模塊也可以支持SMTP信件協議、SNMP的設備控制、peer對peer的協議。另外,消息驅動bean也可以作為連接相關OLTP系統如CICS,IMS,openUTM的橋梁。

            另外還要說明一點,由于新推出的消息驅動bean組件是基于J2EE連接器體系結構的(Java Connector Architecture,JCA1.5),所以該組件具有在消息系統之間良好的移植性。JCA 1.5通常是用于定義商業信息系統中的可移植程序模型。比如說,開發人員可以利用JCA 1.5定義一個基于SMTP的消息驅動bean,而該bean是可以在所有遵循EJB 2.1標準的服務器上移植的(如下圖7)。

          圖7 JCA 1.5

          1、目標鏈接(destination linking)

             EJB 2.1另外一個新特性就是目標鏈接。簡單地說,EJB容器可以將一個消息服務的輸出傳送至另一個消息驅動bean的輸入,即新目標。

             比如說,一個無狀態的會話bean可以使用JMS發送一條異步消息到相應的目標,而在部署應用系統的時候,開發人員可以將該目標連接到一個部署在同一個EJB容器的消息驅動bean。也就是說,開發人員可以使用目標鏈接技術在部署期間定義消息流動,從而在商業平臺描述完整的工作流。

          2、定時器服務機制

            定時器服務機制是一個在EJB容器開發的調度系統。一個無狀態的會話bean或實體bean可以在相應的定時器中登記,從而在未來一定的時間點被定時器通知。

            定時器服務機制使用的是一個簡單的程序框架。作為其基礎的無狀態的會話bean 或實體bean必須實現TimedObject接口:

              public interface javax.ejb.TimedObject{

              public void ejbTimeout(Timer timer);

              }

             當一個bean的相關時間點到達的時候,容器將會調用定時器的ejbTimeout()方法在這個方法中,開發人員將根據需求定義其應用邏輯。比如說,一個關于用戶信息的實體bean具有一個每隔60天觸發的定時器,以用來提醒用戶應該修改密碼。這樣的話,每隔60天,EJB容器就會調用該定時器的ejbTimeout()方法,而這個實體bean就會向相關的mailer模塊發送一條JMS消息,后者將會向用戶的電子信箱發送要求修改密碼的email。Timer對象還具有一些其他特性,比如可以取消一個已定的定時器,查詢在觸發之前還有多少時間等。另外,開發人員還可以將一個定時器對象聯系到一個可序列化的對象,從而在定時器中存儲一些與應用相關的信息。當定時器響應的時候,開發人員可以訪問一定的應用信息并決定如何處理相關的時間。

           EJB可以通過TimerService接口來訪問EJB容器的定時器服務,也就是說實體bean和會話bean必須使用該接口來設定它們自己的定時器。為了達到這一目的,bean必須首先調用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();

              }

             ……

             在一些情況下,開發人員只需要定時器在特定的時間響應一次,而在其他一些情況下,則需要定時器間隔一定時間持續響應。比方說,上面我們提到的ejb就會每隔60天提醒用戶,也就是每隔60天的時間間隔就會響應一次。

            一個無狀態的會話bean或是實體bean可以設定多個定時器,但是一般來說它們都是由相同的ejbTimeout方法管理的。這種方法也可以使用可序列化的對象來區分不同的定時器。

          三)EJBQL的提高

            EJB 2.1也包括兩項對于EJBQL的提高,即order by語句的加入和一些新函數。

          1、order by語句

            以前的EJB規格描述中并沒有包含order by語句,而在EJB 2.1中,EJBQL已經開始支持order by語句的應用了。比如說開發人員可以設計一個數據庫用戶信息查詢,并將查詢結果按照用戶的系統ID排序:

            SELECT OBJECT(I)

            FROM Users as I

            ORDER BY UID

           order by語句通常會寫在EJB遠程或本地接口的查找(finder)或選擇(select)語句中。通常來說在order by語句的標識符(identifier)都是路徑表達式(path expression),并以容器管理的持久性變量結束。這里需要說明的是,order by語句只能應用于相關ejb的容器管理的持久性變量。在order by語句中,開發人員也可以使用DESC或ASC來指定排列結果時下降或上升的次序,其中上升次序是缺省值。

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

             SELECT DISTINCT I.customer.name

          FROM Customer as I

              WHERE I.city=NanJing

              ORDER BY I.customer.name

              當一個EJBQL查詢選出持續性變量時,order by值應用于在該選出語句(select)出現的持續性變量。比如說,在上例中,開發人員無法先選出用戶的姓名,而是使用用戶的年齡進行排序。

          2.新功能

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

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

              比方說,我們可以定義一個查詢,以得到所有住在南京的用戶。這里COUNT函數直接地作用在標識符上,而無需OBJECT()操作:

              SELECT COUNT(C)

              FROM Customer as C

              WHERE C.city=NanJing

          下面的例子中,我們可以得到用戶工資的總和:

              SELECT SUM(C.totalsalary)

              FROM Customer as C

              WHERE C.city=NanJing

          以上我們簡要地介紹了EJB 2.1中的新特性,包括Web服務、消息驅動bean和  EJBQL等方面的提高,有興趣的讀者也可以參照最新的EJB規范描述來進一步研究和實踐。


          作者:務實,多年從事J2EE網站及應用系統項目的開發和應用。

          posted on 2005-06-20 18:01 笨笨 閱讀(202) 評論(0)  編輯  收藏 所屬分類: J2EE 、ALL
          主站蜘蛛池模板: 乡城县| 西乌珠穆沁旗| 唐山市| 从化市| 建德市| 隆昌县| 乌恰县| 金坛市| 额尔古纳市| 凤冈县| 凌云县| 苍山县| 德清县| 杨浦区| 三河市| 武夷山市| 双桥区| 长泰县| 丰台区| 柳江县| 长宁区| 阿坝| 远安县| 齐齐哈尔市| 迭部县| 临邑县| 信宜市| 屏东县| 偏关县| 虹口区| 太康县| 贵定县| 阿勒泰市| 新巴尔虎左旗| 简阳市| 宁强县| 广元市| 揭阳市| 嵊泗县| 富平县| 仁化县|