J2EE教程第3章SessionBean課件_第1頁
J2EE教程第3章SessionBean課件_第2頁
J2EE教程第3章SessionBean課件_第3頁
J2EE教程第3章SessionBean課件_第4頁
J2EE教程第3章SessionBean課件_第5頁
已閱讀5頁,還剩111頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

聲明本課件僅用于北京航空航天大學(xué)計算機學(xué)院的教學(xué);本課件修改采用了一些網(wǎng)絡(luò)資源(論文、研究報告、技術(shù)報告等),在采用的時候并沒有準(zhǔn)確標(biāo)注引用信息。聲明本課件僅用于北京航空航天大學(xué)計算機學(xué)院的教學(xué);1J2EE教程

第3章SessionBeanJ2EE教程

第3章SessionBean2分布式系統(tǒng):程序運行在不同的地址空間(通常是不同的主機上)進程之間的通信是分布式系統(tǒng)的一個基本問題程序A程序B分布式系統(tǒng):程序A程序B3內(nèi)容提要3.1SOCKET3.2RPC3.3RMI3.4SessionBean3.5小結(jié)內(nèi)容提要3.1SOCKET43.1SOCKETSocket是一個基本的通信機制Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。Socket把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。3.1SOCKETSocket是一個基本的通信機制5J2EE教程第3章SessionBean課件6J2EE教程第3章SessionBean課件7優(yōu)勢:功能強大挑戰(zhàn):過于底層,涉及一套復(fù)雜的流程,要求每個應(yīng)用的客戶端和服務(wù)器端都參與到一套復(fù)雜的應(yīng)用層協(xié)議中;程序代碼量多,容易出錯且難以調(diào)試。優(yōu)勢:83.2RPC最初由Sun微系統(tǒng)提出RFC(1984年Birrell和Nelson的一篇論文中提出?),并應(yīng)用于Unix系統(tǒng)IETFONC憲章重新修訂了Sun版本,使得ONCRPC協(xié)議成為IETF標(biāo)準(zhǔn)協(xié)議現(xiàn)在使用最普遍的模式和執(zhí)行是TheOpenGroup組織(前身為OSF,開放式軟件基金)的分布式計算環(huán)境(DCE)3.2RPC最初由Sun微系統(tǒng)提出RFC(19849RPC的基本想法目的是允許程序(Client)調(diào)用駐留在其他機器上的過程(Server)并且使遠(yuǎn)程的過程調(diào)用看起來和本地的過程調(diào)用沒有區(qū)別RPC的做法是引入存根(Stub)的概念RPC的基本想法10若服務(wù)端有某個函數(shù)fn(),為了能夠被遠(yuǎn)程調(diào)用,需要通過編譯器生成兩個stub:客戶端的一個stub:c_fn()服務(wù)器端的一個stub:s_fn()若服務(wù)端有某個函數(shù)fn(),為了能夠被遠(yuǎn)程調(diào)用,需要通過編譯11RPC比LPC復(fù)雜操作系統(tǒng):運行調(diào)用和被調(diào)用進程的計算機可能有明顯不同的體系結(jié)構(gòu)和數(shù)據(jù)表示格式;網(wǎng)絡(luò)通信:調(diào)用進程和被調(diào)用進程間的網(wǎng)絡(luò)比本地計算機有更復(fù)雜的特性。例如,它可能限制消息尺寸,并且有丟失和重排消息的可能,安全問題;編程語言:跨語言之間的互操作問題;RPC比LPC復(fù)雜12J2EE教程第3章SessionBean課件13Stub的對要發(fā)送的參數(shù)進行marshal(可理解成一種打包操作)和對接受到的參數(shù)(或返回值)進行unmarshal(解包)。Marshal操作將要發(fā)送的數(shù)據(jù)制成一種標(biāo)準(zhǔn)的格式(在DCERPC系統(tǒng)中,此格式稱做NetworkDataRepresentation(NDR)格式)unmarshal再從NDR格式數(shù)據(jù)包中讀出所需數(shù)據(jù)該標(biāo)準(zhǔn)格式屏蔽了計算機體系結(jié)構(gòu)和數(shù)據(jù)表示格式的差異Stub的對要發(fā)送的參數(shù)進行marshal(可理解成一種打包14Clientstub的功能:收集調(diào)用遠(yuǎn)程函數(shù)需要的參數(shù)將這些參數(shù)marshal成消息,即把消息轉(zhuǎn)化成標(biāo)準(zhǔn)的網(wǎng)絡(luò)數(shù)據(jù)表示(networkdatarepresentation,NDR)格式,用于在網(wǎng)絡(luò)上傳遞調(diào)用客戶端的運行時系統(tǒng)(Clientruntimesystem)將此消息發(fā)送給服務(wù)器端。當(dāng)服務(wù)器端將結(jié)果消息返回后,將結(jié)果消息unmarshal,把結(jié)果返回給應(yīng)用進程。Serverstub的功能:對發(fā)送給它的參數(shù)消息unmarshal,收集參數(shù)調(diào)用位于本機上的過程將此過程執(zhí)行的結(jié)果marshal成消息,然后調(diào)用服務(wù)器端的運行時系統(tǒng)將結(jié)果消息發(fā)送給客戶端Clientstub的功能:15J2EE教程第3章SessionBean課件16客戶端的運行系統(tǒng)將客戶端stub產(chǎn)生的消息可靠的傳送給server利用TCP/UDP等協(xié)議,將消息發(fā)送到Server服務(wù)端的運行時系統(tǒng)偵聽某個眾所周知的socket端口,接受請求調(diào)用ServerStub,處理接收到的消息運行系統(tǒng)提供了可靠的數(shù)據(jù)傳輸客戶端的運行系統(tǒng)17IDLIDL18Interfacedefinitionfile是一個接口文件,它應(yīng)該由用戶利用IDL(interfacedefinitionlanguage)語言編輯而成。IDL是一種用來說明操作(過程或函數(shù)),操作的參數(shù)以及數(shù)據(jù)類型的語言,它在語法上繼承于C語言,但形式上和C語言有很多不同。IDL屏蔽了編程語言的差異Interfacedefinitionfile是一個接19J2EE教程第3章SessionBean課件203.3RMIRemoteMethodInvocation(RMI)出現(xiàn)于Jdk1.1(2019.02),在Jdk1.2中改進定位:AccesstoRemoteObjectsClient-ServerProtocolHigh-levelAPIJava-to-JavaonlyTransparentLightweight3.3RMIRemoteMethodInvocatio21從RPC到RMI變化:從過程面向?qū)ο髲暮瘮?shù)調(diào)用對實例的操作問題:動態(tài)綁定問題——取得實例的引用接口ClientSend()ServerEcho()Server_StubEcho()

Server_StubEcho()

objobj從RPC到RMI變化:ClientServerServer_22StubObjectServerRemoteObjectpublicinterfaceAdderextendsRemote{publicintadd(intx,inty)throwsRemoteException;}RemoteInterfaceRMIRegistryStubObjectServerRemotepublic233.4SessionBeanRMIStateless遠(yuǎn)程對象總是存在,使用者通過naming取得遠(yuǎn)程對象的引用由服務(wù)提供者控制RemoteObject的創(chuàng)建和銷毀企業(yè)級應(yīng)用要求“遠(yuǎn)程對象”:會話,管理(持久化,生命周期),安全,事務(wù)3.4SessionBeanRMI24SessionBean:讓remoteservice(即SessionBean)實現(xiàn)javax.ejb.SessionBean接口由EJB容器利用SessionBean接口管理SessionBean的生命周期(初始化、銷毀、鈍化等)EJB容器截獲遠(yuǎn)程調(diào)用請求,將請求轉(zhuǎn)發(fā)給SessionBeanEJB容器在這個過程中插入/實現(xiàn)安全、事務(wù)和持久化等處理SessionBean:25SessionBean

andRMIServerContainerRemoteObjectClientEJB(1)Call<HomeObject>.Create()(2)CallbusinessmethodsRMINamingandDiretoryService(n)(1)(n)HomeStubRemoteStubObjectRemoteInterfaceHomeInterfacejavax.ejb.SessionBeanHomeObjectJNDIClientJNDIlookupSessionBeanandRMIServerCont26EJB容器EJB容器27在部署EJB時,容器會為每個EJB:根據(jù)Home接口產(chǎn)生HomeObject生成stub和skeleton根據(jù)部署描述符設(shè)置安全環(huán)境、事務(wù)環(huán)境在JNDI名稱空間中注冊EJB—包括Home接口、資源引用等在部署EJB時,容器會為每個EJB:28客戶端在訪問EJB時:通過JNDI查找到HomeObject的引用通過HomeInterface上的create方法創(chuàng)建一個RemoteObjectHomeObject會創(chuàng)建并返回一個RemoteObject調(diào)用RemoteInterface上的商業(yè)方法RemoteObject截取調(diào)用進行處理,然后委托BeanClass完成商業(yè)方法RemoteObject截取BeanClass的返回進行處理,然后將結(jié)果返回給客戶端客戶端在訪問EJB時:29BeanClass在執(zhí)行商業(yè)方法時可以訪問容器:可以通過EJBContext對象(它是對容器的直接引用)請求關(guān)于環(huán)境的信息:如Client的身份、事務(wù)的狀態(tài)以及自身的引用??梢酝ㄟ^JNDI訪問資源,如JDBC連接、其它的EJB等。BeanClass在執(zhí)行商業(yè)方法時可以訪問容器:30容器在管理EJB生命周期過程中,通過回調(diào)方法通知EJB狀態(tài)的變化:BeanClass實現(xiàn)并響應(yīng)這些回調(diào)方法,進行相應(yīng)的處理。不同類型的EJB回調(diào)方法各不相同,如SessionBean包括:ejbCreate;ejbRemove;ejbPassivate;ejbActivate

。容器在管理EJB生命周期過程中,通過回調(diào)方法通知EJB狀態(tài)的31參考文獻揭開Socket編程的面紗,goodcandles/archive/2019/12/10/294652.aspx

DistributedSystems:ConceptsandDesign,GeorgeCoulouris,JeanDollimore&TimKindberg,1994對分布計算系統(tǒng)的探究,wbright,2019.02chinaitpower/A/2019-02-19/14439.html

Java?RemoteMethodInvocationSpecification,SunMicrosystems,2019JavaRemoteMethodInvocation(RMI),AlexanderDayChaffee,2019,alexcpurpletech

EnterpriseJavaBeansTMSpecification,Version2.0,SunMicrosystems,2019.8MasteringEnterpriseJavaBeansTM,Ed.Roman,2019J2EECourse,(無法找到出處)參考文獻揭開Socket編程的面紗,goodcandles32TheEnd!TheEnd!33Copyright?2019AlexChaffee1.遠(yuǎn)程對象(RemoteObjects)RemoteObjectsLiveonserverAccessedasiftheywerelocalRemoteReferenceLayerTransportLayerJVMClientObjectRemoteReferenceLayerTransportLayerJVMStubRemoteObjectSkeletonCopyright?2019AlexChaffee1.34Copyright?2019AlexChaffee遠(yuǎn)程接口(RemoteInterfaces)DeclareexposedmethodsImplementedonclientLikeaproxyfortheremoteobjectimportjava.rmi.*;publicinterfaceAdderextendsRemote{ publicintadd(intx,inty) throwsRemoteException;}Copyright?2019AlexChaffee遠(yuǎn)程35Copyright?2019AlexChaffee開發(fā)遠(yuǎn)程對象DefineaRemoteInterfaceextendsjava.rmi.RemoteDefineaclassthatimplementstheRemoteInterfaceextendsjava.rmi.RemoteObject orjava.rmi.UnicastRemoteObjectCopyright?2019AlexChaffee開發(fā)36Copyright?2019AlexChaffeeRemoteClassExampleimportjava.rmi.*;importjava.rmi.server.*;publicclassAdderImplextendsUnicastRemoteObjectimplementsAdder{publicAdderImpl()throwsRemoteException{}publicintadd(intx,inty) throwsRemoteException{returnx+y;}}Copyright?2019AlexChaffeeRe37Copyright?2019AlexChaffee2.StubsandSkeletonsStublivesonclientpretendstoberemoteobjectRemoteReferenceLayerTransportLayerJVMClientObjectRemoteReferenceLayerTransportLayerJVMStubRemoteObjectSkeletonSkeletonlivesonserverreceivesrequestsfromstubtalkstotrueremoteobjectdeliversresponsetostubCopyright?2019AlexChaffee2.38Copyright?2019AlexChaffeeCompilingRemoteClasses(Diagram)Adder.java(interface)Adder.class(interfaceclassfile)javacAdderImpl.java(remoteclass)AdderImpl.class(classfile)javacrmicAdderImpl_Skel.class(skeletonclassfile)AdderImpl_Stub.class(stubclassfile)Stubs和skeletons利用rmic編譯器產(chǎn)生Copyright?2019AlexChaffeeCo39Copyright?2019AlexChaffeeRemoteInterfacesandStubsRemoteInterfaceStubRemoteObject(Server)ClientSkeletonimplementsimplementsStub和skeleton類是在運行時確定,并動態(tài)加載的Copyright?2019AlexChaffeeRe40Stub的職責(zé):發(fā)起對遠(yuǎn)程對象的調(diào)用(通過調(diào)用remotereferencelayer)Marshalingargumentstoamarshalstream(employamechanismcalledobjectserialization)Informingtheremotereferencelayerthatthecallshouldbeinvoked.Unmarshalingthereturnvalueorexceptionfromamarshalstream.Informingtheremotereferencelayerthatthecalliscomplete.Stub的職責(zé):發(fā)起對遠(yuǎn)程對象的調(diào)用(通過調(diào)用remote41Theskeletonisresponsiblefor:Unmarshalingargumentsfromthemarshalstream.Makingtheup-calltotheactualremoteobjectimplementation.Marshalingthereturnvalueofthecalloranexception(ifoneoccurred)ontothemarshalstream.Theskeletonisresponsiblefo42Copyright?2019AlexChaffee3.RemoteReferenceLayer提供了RemoteRef對象,代表遠(yuǎn)程服務(wù)實現(xiàn)的鏈接(指出引用了哪個遠(yuǎn)程對象)Stub對象利用RemoteRef的invoke()方法傳遞方法調(diào)用remotereferencelayer和底層的傳輸接口交互RemoteReferenceLayerTransportLayerJVMClientObjectRemoteReferenceLayerTransportLayerJVMStubRemoteObjectSkeletonCopyright?2019AlexChaffee3.43Copyright?2019AlexChaffee4.TransportLayerDealswithcommunicationsConnectionmanagementDispatchingmessagesbetweenstubandskeletonDistributedGarbageCollectionSitsontopofjavaRemoteReferenceLayerTransportLayerJVMClientObjectRemoteReferenceLayerTransportLayerJVMStubRemoteObjectSkeletonCopyright?2019AlexChaffee4.44RMI系統(tǒng)傳輸層的職責(zé):設(shè)置到遠(yuǎn)程地址空間的連接管理連接監(jiān)控連接狀態(tài)(“l(fā)iveness.”)偵聽調(diào)用請求維護地址空間內(nèi)的遠(yuǎn)程對象列表設(shè)置調(diào)用請求的連接定位遠(yuǎn)程調(diào)用目標(biāo)對象的分配器(dispatcher),將連接傳給該分配器RMI系統(tǒng)傳輸層的職責(zé):45Copyright?2019AlexChaffee5.Registries命名和查找遠(yuǎn)程對象服務(wù)器可以注冊它們的對象客戶端可以發(fā)現(xiàn)服務(wù)對象并且獲取遠(yuǎn)程引用注冊器是運行在主機上的進程Copyright?2019AlexChaffee5.46RMIRegistryRMI包含了一個簡單的目錄服務(wù),稱為RMIRegistry,它運行在每個有遠(yuǎn)程服務(wù)對象的主機上接受服務(wù)查詢請求,缺省端口是1099.(objectserverswillbedynamicallyassignedportsbytheRMIruntime)支持stub代碼的動態(tài)下載RMIRegistryRMI包含了一個簡單的目錄服務(wù),稱為47使用RMIRegistryServer-side創(chuàng)建一個實現(xiàn)遠(yuǎn)程服務(wù)的本地對象導(dǎo)出該對象給RMI(創(chuàng)建一個偵聽服務(wù),等待客戶端的連接).用一個公開的名稱,將該對象注冊到RMIRegistry中使用RMIRegistryServer-side48Client-side通過java.rmi.Naming靜態(tài)類訪問RMIRegistry使用方法lookup()查詢注冊器,參數(shù)是URL:

rmi://<host_name>[:<name_service_port>]/<service_name>

該方法返回服務(wù)對象的遠(yuǎn)程引用Client-side49Copyright?2019AlexChaffeeRMI例子RMI系統(tǒng)由以下幾個部分組成:遠(yuǎn)程服務(wù)的接口定義(RemoteInterface)遠(yuǎn)程服務(wù)的實現(xiàn)(RemoteService)Stub和Skeleton文件RMI命名服務(wù),使得客戶端可以發(fā)現(xiàn)遠(yuǎn)程服務(wù)運行遠(yuǎn)程服務(wù)的服務(wù)器需要遠(yuǎn)程服務(wù)的客戶端程序Copyright?2019AlexChaffeeRM50RMI編程編寫并編譯接口的Java代碼(adder.java)編寫并編譯實現(xiàn)類的Java代碼利用RMIC從實現(xiàn)類產(chǎn)生Stub和Skeleton類文件啟動注冊服務(wù)編寫遠(yuǎn)程服務(wù)主機(host)程序的Java代碼,運行之開發(fā)RMI客戶端程序的Java代碼,運行之RMI編程51小結(jié)從RPC到RMI增加了Interface,對應(yīng)于DCERPC中的IDL編譯之后得到的是stub+skeleton增加了對象的創(chuàng)建(服務(wù)器)增加了:注冊和檢索小結(jié)從RPC到RMI52J2EE教程第3章SessionBean課件53SessionBean和Container的契約Bean提供者在EJB類中實現(xiàn)業(yè)務(wù)方法容器提供者將客戶端的函數(shù)調(diào)用委派給EJB的函數(shù)Bean提供者ejbCreate<METHOD>,ejbPostCreate<METHOD>和ejbRemove<METHOD>容器提供者在EJB對象創(chuàng)建、移除和查找的時候調(diào)用這些方法SessionBean和Container的契約Bean提54Bean提供者定義EJBhome和業(yè)務(wù)接口容器提供者提供實現(xiàn)這些接口的類Bean提供者實現(xiàn)javax.ejb.SessionBean(以及可選的javax.ejb.SessionSynchronization)接口中定義的容器回調(diào)函數(shù)容器應(yīng)該在合適的時間調(diào)用這些回調(diào)函數(shù)。Bean提供者定義EJBhome和業(yè)務(wù)接口55容器提供者提供javax.ejb.SessionContext接口給會話Bean實例。該接口使得實例能夠從容器得到上下文信息TherequirementfortheContainertoprovidetothebeaninstancestheJNDIcontextthatcontainstheenterprisebean’senvironment.容器為EJB實例管理事務(wù)、安全、異常。Bean提供者在編程時應(yīng)該避免破壞容器對EJB實例的運行時管理。容器提供者提供javax.ejb.SessionContex56EJB的特征通常包含業(yè)務(wù)邏輯,處理業(yè)務(wù)數(shù)據(jù).EJB的實例由容器在運行時創(chuàng)建和管理EJB可以在部署時定制不同的服務(wù)信息(例如安全、事務(wù))與EJB類是分開的。這使得可以在應(yīng)用裝配和部署的時候通過工具管理服務(wù)信息客戶端的訪問由部署了EJB的容器間接傳遞給該EJB。EJB的特征通常包含業(yè)務(wù)邏輯,處理業(yè)務(wù)數(shù)據(jù).57謝謝謝謝58聲明本課件僅用于北京航空航天大學(xué)計算機學(xué)院的教學(xué);本課件修改采用了一些網(wǎng)絡(luò)資源(論文、研究報告、技術(shù)報告等),在采用的時候并沒有準(zhǔn)確標(biāo)注引用信息。聲明本課件僅用于北京航空航天大學(xué)計算機學(xué)院的教學(xué);59J2EE教程

第3章SessionBeanJ2EE教程

第3章SessionBean60分布式系統(tǒng):程序運行在不同的地址空間(通常是不同的主機上)進程之間的通信是分布式系統(tǒng)的一個基本問題程序A程序B分布式系統(tǒng):程序A程序B61內(nèi)容提要3.1SOCKET3.2RPC3.3RMI3.4SessionBean3.5小結(jié)內(nèi)容提要3.1SOCKET623.1SOCKETSocket是一個基本的通信機制Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。Socket把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。3.1SOCKETSocket是一個基本的通信機制63J2EE教程第3章SessionBean課件64J2EE教程第3章SessionBean課件65優(yōu)勢:功能強大挑戰(zhàn):過于底層,涉及一套復(fù)雜的流程,要求每個應(yīng)用的客戶端和服務(wù)器端都參與到一套復(fù)雜的應(yīng)用層協(xié)議中;程序代碼量多,容易出錯且難以調(diào)試。優(yōu)勢:663.2RPC最初由Sun微系統(tǒng)提出RFC(1984年Birrell和Nelson的一篇論文中提出?),并應(yīng)用于Unix系統(tǒng)IETFONC憲章重新修訂了Sun版本,使得ONCRPC協(xié)議成為IETF標(biāo)準(zhǔn)協(xié)議現(xiàn)在使用最普遍的模式和執(zhí)行是TheOpenGroup組織(前身為OSF,開放式軟件基金)的分布式計算環(huán)境(DCE)3.2RPC最初由Sun微系統(tǒng)提出RFC(198467RPC的基本想法目的是允許程序(Client)調(diào)用駐留在其他機器上的過程(Server)并且使遠(yuǎn)程的過程調(diào)用看起來和本地的過程調(diào)用沒有區(qū)別RPC的做法是引入存根(Stub)的概念RPC的基本想法68若服務(wù)端有某個函數(shù)fn(),為了能夠被遠(yuǎn)程調(diào)用,需要通過編譯器生成兩個stub:客戶端的一個stub:c_fn()服務(wù)器端的一個stub:s_fn()若服務(wù)端有某個函數(shù)fn(),為了能夠被遠(yuǎn)程調(diào)用,需要通過編譯69RPC比LPC復(fù)雜操作系統(tǒng):運行調(diào)用和被調(diào)用進程的計算機可能有明顯不同的體系結(jié)構(gòu)和數(shù)據(jù)表示格式;網(wǎng)絡(luò)通信:調(diào)用進程和被調(diào)用進程間的網(wǎng)絡(luò)比本地計算機有更復(fù)雜的特性。例如,它可能限制消息尺寸,并且有丟失和重排消息的可能,安全問題;編程語言:跨語言之間的互操作問題;RPC比LPC復(fù)雜70J2EE教程第3章SessionBean課件71Stub的對要發(fā)送的參數(shù)進行marshal(可理解成一種打包操作)和對接受到的參數(shù)(或返回值)進行unmarshal(解包)。Marshal操作將要發(fā)送的數(shù)據(jù)制成一種標(biāo)準(zhǔn)的格式(在DCERPC系統(tǒng)中,此格式稱做NetworkDataRepresentation(NDR)格式)unmarshal再從NDR格式數(shù)據(jù)包中讀出所需數(shù)據(jù)該標(biāo)準(zhǔn)格式屏蔽了計算機體系結(jié)構(gòu)和數(shù)據(jù)表示格式的差異Stub的對要發(fā)送的參數(shù)進行marshal(可理解成一種打包72Clientstub的功能:收集調(diào)用遠(yuǎn)程函數(shù)需要的參數(shù)將這些參數(shù)marshal成消息,即把消息轉(zhuǎn)化成標(biāo)準(zhǔn)的網(wǎng)絡(luò)數(shù)據(jù)表示(networkdatarepresentation,NDR)格式,用于在網(wǎng)絡(luò)上傳遞調(diào)用客戶端的運行時系統(tǒng)(Clientruntimesystem)將此消息發(fā)送給服務(wù)器端。當(dāng)服務(wù)器端將結(jié)果消息返回后,將結(jié)果消息unmarshal,把結(jié)果返回給應(yīng)用進程。Serverstub的功能:對發(fā)送給它的參數(shù)消息unmarshal,收集參數(shù)調(diào)用位于本機上的過程將此過程執(zhí)行的結(jié)果marshal成消息,然后調(diào)用服務(wù)器端的運行時系統(tǒng)將結(jié)果消息發(fā)送給客戶端Clientstub的功能:73J2EE教程第3章SessionBean課件74客戶端的運行系統(tǒng)將客戶端stub產(chǎn)生的消息可靠的傳送給server利用TCP/UDP等協(xié)議,將消息發(fā)送到Server服務(wù)端的運行時系統(tǒng)偵聽某個眾所周知的socket端口,接受請求調(diào)用ServerStub,處理接收到的消息運行系統(tǒng)提供了可靠的數(shù)據(jù)傳輸客戶端的運行系統(tǒng)75IDLIDL76Interfacedefinitionfile是一個接口文件,它應(yīng)該由用戶利用IDL(interfacedefinitionlanguage)語言編輯而成。IDL是一種用來說明操作(過程或函數(shù)),操作的參數(shù)以及數(shù)據(jù)類型的語言,它在語法上繼承于C語言,但形式上和C語言有很多不同。IDL屏蔽了編程語言的差異Interfacedefinitionfile是一個接77J2EE教程第3章SessionBean課件783.3RMIRemoteMethodInvocation(RMI)出現(xiàn)于Jdk1.1(2019.02),在Jdk1.2中改進定位:AccesstoRemoteObjectsClient-ServerProtocolHigh-levelAPIJava-to-JavaonlyTransparentLightweight3.3RMIRemoteMethodInvocatio79從RPC到RMI變化:從過程面向?qū)ο髲暮瘮?shù)調(diào)用對實例的操作問題:動態(tài)綁定問題——取得實例的引用接口ClientSend()ServerEcho()Server_StubEcho()

Server_StubEcho()

objobj從RPC到RMI變化:ClientServerServer_80StubObjectServerRemoteObjectpublicinterfaceAdderextendsRemote{publicintadd(intx,inty)throwsRemoteException;}RemoteInterfaceRMIRegistryStubObjectServerRemotepublic813.4SessionBeanRMIStateless遠(yuǎn)程對象總是存在,使用者通過naming取得遠(yuǎn)程對象的引用由服務(wù)提供者控制RemoteObject的創(chuàng)建和銷毀企業(yè)級應(yīng)用要求“遠(yuǎn)程對象”:會話,管理(持久化,生命周期),安全,事務(wù)3.4SessionBeanRMI82SessionBean:讓remoteservice(即SessionBean)實現(xiàn)javax.ejb.SessionBean接口由EJB容器利用SessionBean接口管理SessionBean的生命周期(初始化、銷毀、鈍化等)EJB容器截獲遠(yuǎn)程調(diào)用請求,將請求轉(zhuǎn)發(fā)給SessionBeanEJB容器在這個過程中插入/實現(xiàn)安全、事務(wù)和持久化等處理SessionBean:83SessionBean

andRMIServerContainerRemoteObjectClientEJB(1)Call<HomeObject>.Create()(2)CallbusinessmethodsRMINamingandDiretoryService(n)(1)(n)HomeStubRemoteStubObjectRemoteInterfaceHomeInterfacejavax.ejb.SessionBeanHomeObjectJNDIClientJNDIlookupSessionBeanandRMIServerCont84EJB容器EJB容器85在部署EJB時,容器會為每個EJB:根據(jù)Home接口產(chǎn)生HomeObject生成stub和skeleton根據(jù)部署描述符設(shè)置安全環(huán)境、事務(wù)環(huán)境在JNDI名稱空間中注冊EJB—包括Home接口、資源引用等在部署EJB時,容器會為每個EJB:86客戶端在訪問EJB時:通過JNDI查找到HomeObject的引用通過HomeInterface上的create方法創(chuàng)建一個RemoteObjectHomeObject會創(chuàng)建并返回一個RemoteObject調(diào)用RemoteInterface上的商業(yè)方法RemoteObject截取調(diào)用進行處理,然后委托BeanClass完成商業(yè)方法RemoteObject截取BeanClass的返回進行處理,然后將結(jié)果返回給客戶端客戶端在訪問EJB時:87BeanClass在執(zhí)行商業(yè)方法時可以訪問容器:可以通過EJBContext對象(它是對容器的直接引用)請求關(guān)于環(huán)境的信息:如Client的身份、事務(wù)的狀態(tài)以及自身的引用??梢酝ㄟ^JNDI訪問資源,如JDBC連接、其它的EJB等。BeanClass在執(zhí)行商業(yè)方法時可以訪問容器:88容器在管理EJB生命周期過程中,通過回調(diào)方法通知EJB狀態(tài)的變化:BeanClass實現(xiàn)并響應(yīng)這些回調(diào)方法,進行相應(yīng)的處理。不同類型的EJB回調(diào)方法各不相同,如SessionBean包括:ejbCreate;ejbRemove;ejbPassivate;ejbActivate

。容器在管理EJB生命周期過程中,通過回調(diào)方法通知EJB狀態(tài)的89參考文獻揭開Socket編程的面紗,goodcandles/archive/2019/12/10/294652.aspx

DistributedSystems:ConceptsandDesign,GeorgeCoulouris,JeanDollimore&TimKindberg,1994對分布計算系統(tǒng)的探究,wbright,2019.02chinaitpower/A/2019-02-19/14439.html

Java?RemoteMethodInvocationSpecification,SunMicrosystems,2019JavaRemoteMethodInvocation(RMI),AlexanderDayChaffee,2019,alexcpurpletech

EnterpriseJavaBeansTMSpecification,Version2.0,SunMicrosystems,2019.8MasteringEnterpriseJavaBeansTM,Ed.Roman,2019J2EECourse,(無法找到出處)參考文獻揭開Socket編程的面紗,goodcandles90TheEnd!TheEnd!91Copyright?2019AlexChaffee1.遠(yuǎn)程對象(RemoteObjects)RemoteObjectsLiveonserverAccessedasiftheywerelocalRemoteReferenceLayerTransportLayerJVMClientObjectRemoteReferenceLayerTransportLayerJVMStubRemoteObjectSkeletonCopyright?2019AlexChaffee1.92Copyright?2019AlexChaffee遠(yuǎn)程接口(RemoteInterfaces)DeclareexposedmethodsImplementedonclientLikeaproxyfortheremoteobjectimportjava.rmi.*;publicinterfaceAdderextendsRemote{ publicintadd(intx,inty) throwsRemoteException;}Copyright?2019AlexChaffee遠(yuǎn)程93Copyright?2019AlexChaffee開發(fā)遠(yuǎn)程對象DefineaRemoteInterfaceextendsjava.rmi.RemoteDefineaclassthatimplementstheRemoteInterfaceextendsjava.rmi.RemoteObject orjava.rmi.UnicastRemoteObjectCopyright?2019AlexChaffee開發(fā)94Copyright?2019AlexChaffeeRemoteClassExampleimportjava.rmi.*;importjava.rmi.server.*;publicclassAdderImplextendsUnicastRemoteObjectimplementsAdder{publicAdderImpl()throwsRemoteException{}publicintadd(intx,inty) throwsRemoteException{returnx+y;}}Copyright?2019AlexChaffeeRe95Copyright?2019AlexChaffee2.StubsandSkeletonsStublivesonclientpretendstoberemoteobjectRemoteReferenceLayerTransportLayerJVMClientObjectRemoteReferenceLayerTransportLayerJVMStubRemoteObjectSkeletonSkeletonlivesonserverreceivesrequestsfromstubtalkstotrueremoteobjectdeliversresponsetostubCopyright?2019AlexChaffee2.96Copyright?2019AlexChaffeeCompilingRemoteClasses(Diagram)Adder.java(interface)Adder.class(interfaceclassfile)javacAdderImpl.java(remoteclass)AdderImpl.class(classfile)javacrmicAdderImpl_Skel.class(skeletonclassfile)AdderImpl_Stub.class(stubclassfile)Stubs和skeletons利用rmic編譯器產(chǎn)生Copyright?2019AlexChaffeeCo97Copyright?2019AlexChaffeeRemoteInterfacesandStubsRemoteInterfaceStubRemoteObject(Server)ClientSkeletonimplementsimplementsStub和skeleton類是在運行時確定,并動態(tài)加載的Copyright?2019AlexChaffeeRe98Stub的職責(zé):發(fā)起對遠(yuǎn)程對象的調(diào)用(通過調(diào)用remotereferencelayer)Marshalingargumentstoamarshalstream(employamechanismcalledobjectserialization)Informingtheremotereferencelayerthatthecallshouldbeinvoked.Unmarshalingthereturnvalueorexceptionfromamarshalstream.Informingtheremotereferencelayerthatthecalliscomplete.Stub的職責(zé):發(fā)起對遠(yuǎn)程對象的調(diào)用(通過調(diào)用remote99Theskeletonisresponsiblefor:Unmarshalingargumentsfromthemarshalstream.Makingtheup-calltotheactualremoteobjectimplementation.Marshalingthereturnvalueofthecalloranexception(ifoneoccurred)ontothemarshalstream.Theskeletonisresponsiblefo100Copyright?2019AlexChaffee3.RemoteReferenceLayer提供了RemoteRef對象,代表遠(yuǎn)程服務(wù)實現(xiàn)的鏈接(指出引用了哪個遠(yuǎn)程對象)Stub對象利用RemoteRef的invoke()方法傳遞方法調(diào)用remotereferencelayer和底層的傳輸接口交互RemoteReferenceLayerTransportLayerJVMClientObjectRemoteReferenceLayerTransportLayerJVMStubRemoteObjectSkeletonCopyright?2019AlexChaffee3.101Copyright?2019AlexChaffee4.TransportLayerDealswithcommunicationsConnectionmanagementDispatchingmessagesbetweenstubandskeletonDistributedGarbageCollectionSitsontopofjavaRemoteReferenceLayerTransportLayerJVMClientObjectRemoteReferenceLayerTransportLayerJVMStubRemoteObjectSkeletonCopyright?2019AlexChaffee4.102RMI系統(tǒng)傳輸層的職責(zé):設(shè)置到遠(yuǎn)程地址空間的連接管理連接監(jiān)控連接狀態(tài)(“l(fā)iveness.”)偵聽調(diào)用請求維護地址空間內(nèi)的遠(yuǎn)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論