EJB20編程模型課件_第1頁
EJB20編程模型課件_第2頁
EJB20編程模型課件_第3頁
EJB20編程模型課件_第4頁
EJB20編程模型課件_第5頁
已閱讀5頁,還剩57頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第十三講EJB2.0編程實例內(nèi)容回顧EJB概述EJB的特點、EJB容器、EJB運行方式SessionBean有狀態(tài)SessionBean和無狀態(tài)SessionBean實體BeanCMP和BMP消息驅(qū)動Bean本講教學(xué)教學(xué)目標(biāo):13.1SessionBean的應(yīng)用開發(fā)13.2JMS13.3消息驅(qū)動Bean簡介13.4消息驅(qū)動Bean編程實例教學(xué)重點:無狀態(tài)會話Bean的開發(fā),消息驅(qū)動Bean編程教學(xué)難點:

JMS13.1.1無狀態(tài)會話Bean的開發(fā)創(chuàng)建Remote接口創(chuàng)建Home接口創(chuàng)建Bean類編輯部署文件編寫客戶端測試程序代碼13.1.1無狀態(tài)會話Bean的開發(fā)創(chuàng)建Remote接口Remote接口的作用是展示Bean類的哪些方法可以供遠(yuǎn)程客戶端訪問。

javax.ejb.EJBObject接口中定義了以下幾個方法EJBHomegetEJBHome(),該方法返回創(chuàng)建該對象的home接口。ObjectgetPrimaryKey(),該方法得到EJB對象的主鍵HandlegetHandle(),該方法得到EJB對象的句柄booleanisIdentical(EJBObjecteJBObject),判斷調(diào)用的EJB對象和給定的EJB對象是否一致

voidremove(),刪除EJB對象13.1.1無狀態(tài)會話Bean的開發(fā)importjavax.ejb.EJBObject;importjava.rmi.RemoteException;publicinterfaceHelloWorldextendsEJBObject{publicStringsayHello(Stringmsg)throwsRemoteException;}導(dǎo)入要使用的類或者接口繼承javax.ejb.EJBObject接口要聲明為Public所有的方法要聲明為Public;方法聲明要遵循RMI規(guī)范;方法聲明要拋出java.rmi.RemoteException;方法參數(shù)及返回值是可序列化的對象。13.1.1無狀態(tài)會話Bean的開發(fā)importjavax.ejb.EJBHome;importjavax.ejb.CreateException;importjava.rmi.RemoteException;publicinterfaceHelloWorldHomeextendsEJBHome{publicHelloWorldcreate()throwsCreateException,RemoteException;}導(dǎo)入要使用的類或者接口繼承javax.ejb.EJBHome接口要聲明為public注意:沒有參數(shù)返回值類型是Remote接口,得到EJB對象的引用異常列表,除了RemoteException之外,還有一個異常CreateException13.1.1無狀態(tài)會話Bean的開發(fā)3.創(chuàng)建Bean類Bean類必須實現(xiàn)javax.ejb.SessionBeanvoidsetSessionContext(SessionContextc),該方法用于設(shè)置會話上下文環(huán)境,完成初始化工作。voidejbRemove(),刪除會話Bean。voidejbActivate(),Bean被激活時需要執(zhí)行的動作。voidejbPassivate(),Bean被掛起操作之前需要執(zhí)行的動作。定義成員變量SessionContext的對象,從這個對象可以獲取一些容器相關(guān)的屬性。實現(xiàn)ejbCreate(),創(chuàng)建EJB實例,但是對無狀態(tài)Bean來說沒有作用。因此,只寫方法定義,不需要寫代碼。實現(xiàn)Remote接口中聲明的業(yè)務(wù)方法13.1.1無狀態(tài)會話Bean的開發(fā)importjavax.ejb.SessionBean;importjavax.ejb.SessionContext;importjavax.ejb.CreateException;publicclassHelloWorldBeanimplementsSessionBean{SessionContextsessionContext;publicvoidejbCreate()throwsCreateException{}publicvoidejbRemove(){}publicvoidejbActivate(){}publicvoidejbPassivate(){}publicvoidsetSessionContext(SessionContextsessionContext){this.sessionContext=sessionContext;}publicStringsayHello(Stringmsg){System.out.println("HelloWorld"+msg);return"HelloWorld"+msg;}}13.1.1無狀態(tài)會話Bean的開發(fā)<ejb-jar><display-name>HelloWorldEJB</display-name><enterprise-beans><session><ejb-name>HelloWorld</ejb-name><home>helloworldsessionejb.HelloWorldHome</home><remote>helloworldsessionejb.HelloWorld</remote><ejb-class>helloworldsessionejb.HelloWorldBean</ejb-class><session-type>Stateless</session-type><transaction-type>Container</transaction-type></session></enterprise-beans></ejb-jar>注意:并不是每個EJB對應(yīng)一個部署文件。通常情況下,一個EJB對應(yīng)一個部署文件。并且一個EJB應(yīng)用可以包括多個EJB,即可會話Bean,也可以是實體Bean,還可以是消息Bean。<weblogic-enterprise-bean><ejb-name>HelloWorld</ejb-name><jndi-name>HelloWorld</jndi-name><caching-descriptor><max-bean-in-free-pool>100</max-bean-in-free-pool></caching-descriptor></weblogic-enterprise-bean>13.1.1無狀態(tài)會話Bean的開發(fā)EJB緩沖池13.1.1無狀態(tài)會話Bean的開發(fā)5.編寫客戶端測試程序代碼創(chuàng)建上下文環(huán)境通過上下文環(huán)境查找home對象通過home對象創(chuàng)建ejb對象調(diào)用ejb對象的方法,ejb對象再調(diào)用Bean實例的方法清除遠(yuǎn)程對象13.1.1無狀態(tài)會話Bean的開發(fā)Contextcontext=getInitialContext();Objectref=context.lookup("HelloWorld");helloWorldHome=(HelloWorldHome)PortableRemoteObject.narrow(ref,HelloWorldHome.class);ctx=newInitialContext(properties);//建立數(shù)據(jù)源對象ds=(javax.sql.DataSource)ctx.lookup("mysqlDS");

遠(yuǎn)程lookup一個對象的時候,返回的對象的引用并不明確。我們只知道它是一個Object,而不清楚是否是我們所需要的特定的類的對象(這里就是EjbHome)。所以用narrow方法,把lookup到的對象和EjbHome.class作為參數(shù)傳進(jìn)去,檢查是否匹配,然后再轉(zhuǎn)換成我們需要的類型。

本地lookup一個對象的時候就有所不同,因為本地的對象是已經(jīng)在本地JVM中存在的,注冊過的Class的對象,所以已經(jīng)知道lookup到的對象是什么類的引用,因此,就不必用narrow方法檢查,而可以直接轉(zhuǎn)型。

通過上下文環(huán)境查找home對象13.1.1無狀態(tài)會話Bean的開發(fā)PortableRemoteObject.narrow()方法在EJB1.1中被首次引入,并繼續(xù)沿用于EJB3.0的遠(yuǎn)程客戶端。檢查以確保遠(yuǎn)程或抽象接口類型的對象可以強制轉(zhuǎn)換為所需的類型。publicstaticObjectnarrow(Object

narrowFrom,Class

narrowTo)throwsClassCastException要檢查的對象所需的類型可以強制轉(zhuǎn)換為所需類型的對象13.1.1無狀態(tài)會話Bean的開發(fā)publicHelloWorldcreate(){……try{helloWorld=helloWorldHome.create();……}catch(Exceptione){……}……

returnhelloWorld;}通過home對象創(chuàng)建ejb對象13.1.1無狀態(tài)會話Bean的開發(fā)publicStringsayHello(Stringmsg){StringreturnValue="";……try{

returnValue=helloWorld.sayHello(msg);……}catch(Exceptione){e.printStackTrace();}……returnreturnValue;}13.1.2有狀態(tài)會話Bean的開發(fā)創(chuàng)建Remote接口創(chuàng)建Home接口創(chuàng)建Bean類編輯部署文件編寫客戶端測試程序代碼13.1.2有狀態(tài)會話Bean的開發(fā)

publicvoidejbCreate(String_cardHolderName,String_creditCardNumber)throwsCreateException{cardHolderName=_cardHolderName;creditCardNumber=_creditCardNumber;}小結(jié)RMIRMI采用stubs和skeletons來進(jìn)行遠(yuǎn)程對象的通訊。EJB2.0編輯模型封裝業(yè)務(wù)規(guī)則的Bean類本身進(jìn)行編碼外,EJB開發(fā)人員還必須為Bean定義一個對外接口和一個Home接口。SessionBean的應(yīng)用開發(fā)創(chuàng)建Remote接口創(chuàng)建Home接口創(chuàng)建Bean類編輯部署文件編寫客戶端測試程序代碼13.2.1消息服務(wù)消息服務(wù)是一種在分布式應(yīng)用之間提供消息傳遞服務(wù)的系統(tǒng)。消息服務(wù)為客戶端程序提供一個標(biāo)準(zhǔn)接口,這個接口隔離了底層的消息服務(wù),使得各種不同的客戶端程序能夠通過一個統(tǒng)一的編程接口與消息服務(wù)系統(tǒng)交互。實現(xiàn)過程:封裝發(fā)送者和接收者之間傳遞的消息,并在與分布式客戶程序交互的位置上添加了一個軟件處理層。13.2.2JMS簡介JMS(JavaMessageService)是一個消息標(biāo)準(zhǔn),它允許J2EE應(yīng)用程序組件生成、發(fā)送、接收和讀取消息。它能夠分布式松耦合的、可靠和異步的信息交流。是一個JavaAPI,它定義了客戶端程序如何以一種標(biāo)準(zhǔn)的形式與底層的消息服務(wù)提供者交互。13.2.2JMS簡介JMS的應(yīng)用組成消息發(fā)送者(消息生產(chǎn)者):消息的創(chuàng)造和發(fā)送者,是消息的發(fā)源地。JMS提供者實現(xiàn)JMSAPI接口的消息系統(tǒng),是消息的中轉(zhuǎn)站。消息接收者(消息消費者):接收消息的應(yīng)用程序,是消息最終的目的地。管理對象:預(yù)定義的JMS對象,客戶端使用這些預(yù)定義的對象進(jìn)行通信。消息13.2.2JMS簡介JMS消息消息頭字段標(biāo)識消息和路由消息屬性在消息中設(shè)置應(yīng)用選定的屬性。屬性采用“名字/值”的形式,消息體消息的實際數(shù)據(jù)內(nèi)容13.2.2JMS簡介消息類型StreamMessage:消息由串行化的Java對象組成,必須按照設(shè)置時的順序讀取對象。MapMessage:消息由名稱/值對組成,其中名為字符串類型,值為Java數(shù)據(jù)類型??梢允褂昧信e順序讀取,也可以通過名稱無序的獲取值。TextMessage消息的主體為字符串。ObjectMessage消息的主體為串行化的Java對象,可以是自定義的串行化的Java對象.BytesMessage消息的主體是二進(jìn)制的數(shù)據(jù)13.2.2JMS簡介消息傳遞方式非持久性(NON_PERSISTENT)模式消息沒有保存到持久的存儲介質(zhì),如果JMS服務(wù)器崩潰,則所有的非持久消息都將丟失。可靠性最低,性能高。持久性(PERSISTENT)模式消息存儲到持久介質(zhì)上,即使JMS服務(wù)器崩潰,消息也不會丟失。可靠性高,性能低,JMS服務(wù)器但需要保證不會重復(fù)發(fā)送消息。13.2.3JMS消息通信機制點到點通信(PTP)JMS把每一個消息傳遞給一個消息費者,通過一個消息隊列實現(xiàn),消息的生產(chǎn)者向隊列寫入消息,消息的消費者從隊列中讀取消息。13.2.3JMS消息通信機制點到點通信特點每一個消息傳遞給一個消息費者,并且只有惟一的一個,即一個消息生產(chǎn)者對應(yīng)一個消息消費者。消息的接收者和發(fā)送者之間不存在時間上的依賴關(guān)系。不論發(fā)送者發(fā)送消息時接收者是否在運行,接收者都可以提取信息。接收者對于成功處理的消息給出回執(zhí)。13.2.3JMS消息通信機制發(fā)布/訂閱(Publish/Subcribe)把一個消息發(fā)送給一個主題,消息服務(wù)器將消息發(fā)布給訂閱該主題的每一個訂閱者。13.2.3JMS消息通信機制發(fā)布/訂閱模型的特點:一個消息生產(chǎn)者對應(yīng)多個消息消費者。訂閱某個話題的客戶端程序只能收到那些在其訂閱之后發(fā)布的消息。發(fā)布者和訂閱者存在時間上的依賴關(guān)系,為了接收到消息,訂閱者必須保持活動狀態(tài)。JMS允許創(chuàng)建持久性訂閱。有了持久性訂閱,當(dāng)訂閱者不是活動狀態(tài)時,也可以接收到消息。13.2.4JMS的使用創(chuàng)建1創(chuàng)建2創(chuàng)建4獲取3創(chuàng)建5613.2.4JMS的使用JMS相關(guān)API連接工廠(ConnectionFactory):創(chuàng)建一個管理對象,由服務(wù)器的管理員創(chuàng)建,并綁定到JNDI樹上。客戶端使用JNDI檢索ConnectionFactory,然后利用它建立一個JMS連接。連接(Connection)代表一個與JMS提供者的活動連接目的(Destination)標(biāo)識消息的接收方式,實際的消息源和消息存儲位置會話(Session)表示客戶端與JMS服務(wù)器之間的會話狀態(tài)。消息生產(chǎn)者(MessageProducer)由Session創(chuàng)建的用于將消息發(fā)送到目的的一個對象消息消費者(MessageConsumer)由Session創(chuàng)建的用于從目的接收消息的一個對象13.2.4JMS的使用發(fā)送消息的過程獲得一個WebLogicServer上下文的引用;使用JNDI查詢管理對象ConnectionFactory和Destination使用管理對象ConnectionFactory建立連接Connection使用Connection建立會話Session使用Session和Destination創(chuàng)建消息生產(chǎn)者M(jìn)essageProducer。使用連接創(chuàng)建一個需要發(fā)送的消息類型的實例;使用消息生產(chǎn)者M(jìn)essageProducer發(fā)送消息MessageConsumer13.2.4JMS的使用PTPpub/sub連接工廠連接目的會話消息生產(chǎn)者消息消費者QueueConnectionFactoryQueueConnectionQueueDestinationQueueSessionQueueMessageProducerQueueMessageConsumerTopicConnectionFactoryTopicConnectionTopicDestinationTopicSessionTopicMessageProducerTopicMessageConsumer13.2.4JMS的使用點到點的消息模型實現(xiàn)配置JMS創(chuàng)建JMS持久存儲(可選):可以選擇創(chuàng)建文件方式和數(shù)據(jù)庫方式的存儲。配置JMS服務(wù)器:所有由JMS管理的對象,包括隊列、主題都位于特定的JMS服務(wù)器中。創(chuàng)建JMS連接工廠:WebLogicServer提供默認(rèn)的連接工廠(weblogic.jms.ConnectionFactory)配置JMS模塊:用來存儲JMS相關(guān)資源,包括隊列、主題、連接工廠和模板等對象。創(chuàng)建JMS消息隊列編寫程序13.2.5JMS的編程實例創(chuàng)建工程:MyJMS創(chuàng)建JMS類:JMSExample輸入類的屬性:className、Package、BaseClass(java.lang.Object)輸入Domain屬性(JMS應(yīng)用的類別):PTP設(shè)置Factoryname:weblogic.jms.ConnectionFactory設(shè)置Queuename:MyJMSQueue修改JMS類setEnvironmentsendTextonMessagegetQueueReceiver13.2.5JMS的編程實例建立消息生產(chǎn)者程序:MyProducer建立JMS類對象myQueue調(diào)用JMS類對象的setEnvironment方法設(shè)置WeblogicServer的JNDI名字服務(wù)調(diào)用sendText發(fā)送消息建立消息消費者程序:MyListener建立JMS類對象myQueue調(diào)用JMS類對象的setEnvironment方法設(shè)置WeblogicServer的JNDI名字服務(wù)調(diào)用getQueueReceiver建立消息消費者。13.2.5JMS的編程實例創(chuàng)建1創(chuàng)建2創(chuàng)建4獲取3創(chuàng)建56getQueueConnectionFactory()getQueueConnection()getQueueSession()getQueueReceiver()getQueueSender()getSendQueue()sendText()getRecvQueue()onMessage()13.2.5JMS的編程實例publicQueueConnectionFactorygetQueueConnectionFactory()throwsException{if(queueConnectionFactory==null){Objectobj=getContext().lookup(queueConnectionFactoryName);queueConnectionFactory=(QueueConnectionFactory)obj;}returnqueueConnectionFactory;}privateContextgetContext()throwsException{if(context==null){try{context=getInitialContext();}catch(Exceptionex){ex.printStackTrace();throwex;}}returncontext;}13.2.5JMS的編程實例publicQueueConnectiongetQueueConnection()throwsException{if(queueConnection==null){queueConnection=getQueueConnectionFactory().createQueueConnection();queueConnection.start();}returnqueueConnection;}publicQueueSessiongetQueueSession()throwsException{if(queueSession==null){queueSession=getQueueConnection().createQueueSession(isTransacted(),getAcknowledgementMode());}returnqueueSession;}13.2.5JMS的編程實例publicQueuegetSendQueue()throwsException{if(queue==null){Objectobj=getContext().lookup(sendQueueName);queue=(Queue)obj;}returnqueue;publicQueueSendergetQueueSender()throwsException{if(queueSender==null){queueSender=getQueueSession().createSender(getSendQueue());}returnqueueSender;}13.2.5JMS的編程實例publicvoidsendText(Stringmessage)throwsException{javax.jms.TextMessagetextMessage=getQueueSession().createTextMessage();textMessage.clearBody();textMessage.setText(message);getQueueSender().send(textMessage);if(isTransacted()){getQueueSession().commit();}}13.2.5JMS的編程實例publicvoidonMessage(Messagemessage){if(messageinstanceofjavax.jms.BytesMessage){javax.jms.BytesMessagebytesMessage=(javax.jms.BytesMessage)message;}……elseif(messageinstanceofjavax.jms.TextMessage){javax.jms.TextMessageobjectMessage=(javax.jms.TextMessage)message;try{System.out.println("Messagecontentis:"+objectMessage.getText());}catch(JMSExceptione){e.printStackTrace();}}……}13.2.5JMS的編程實例publicvoidclose()throwsException{if(queueSender!=null){queueSender.close();}if(queueReceiver!=null){queueReceiver.close();}if(queueSession!=null){queueSession.close();}if(queueConnection!=null){queueConnection.close();}}13.3消息驅(qū)動Bean簡介消息驅(qū)動Bean是一種EJB,與消息服務(wù)相關(guān),是異步的消息消費者。消息驅(qū)動Bean可以實現(xiàn)任何類型的消息。如:隊列和主題13.3消息驅(qū)動Bean簡介13.3消息驅(qū)動Bean簡介MDB的特點:1)沒有home/localhome以及remote/local接口,只有一個bean類;2)只有一個商業(yè)方法onMessage方法,MDB的bean類實現(xiàn)了MessageListener和MessageDrivenBean接口,MessageListener接口中定義了這個方法;3)沒有任何返回值;4)不能拋異常給消息的生產(chǎn)者,在onMessage方法中只能拋出系統(tǒng)級別的異常,不能拋出應(yīng)用級別的異常;5)MDB是無狀態(tài)的,所以可以引入pool機制提高消息處理的效率;6)可以是持久的或則非持久的訂閱者.13.3消息驅(qū)動Bean簡介生命周期:容器管理生命周期EJB容器調(diào)用消息驅(qū)動Bean類的newInstance()創(chuàng)建一個實例EJB容器調(diào)用setMessageDrivenContext方法調(diào)用ejbCreate方法消息驅(qū)動Bean調(diào)用onMessage方法處理消息EJB容器調(diào)用ejbRemove方法,結(jié)束消息驅(qū)動Bean的生命周期13.4消息驅(qū)動Bean編程實例因為消息驅(qū)動Bean主要作為消息的監(jiān)聽者沒有專門的客戶端,所以消息驅(qū)動Bean的組成沒有供遠(yuǎn)程訪問的接口和供本地訪問的接口,只有Bean類和配置描述符。Bean類要實現(xiàn)一個接口javax.ejb.MessageDriven-Bean,作為消息的監(jiān)聽者,需要實現(xiàn)接口javax.jms.MessageListener實現(xiàn)onMessage方法13.4消息驅(qū)動Bean編程實例publicclassmdbHelloBeanimplementsMessageDrivenBean,MessageListener{MessageDrivenContextmessageDrivenContext;publicvoidejbCreate()throwsCreateException{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論