《J2EE教程SessionBean课件》由会员分享,可在线阅读,更多相关《J2EE教程SessionBean课件(57页珍藏版)》请在金锄头文库上搜索。
1、声明声明n本课件仅用于北京航空航天大学计算机学院的本课件仅用于北京航空航天大学计算机学院的教学;教学;n本课件修改采用了一些网络资源(论文、研究本课件修改采用了一些网络资源(论文、研究报告、技术报告等),在采用的时候并没有准报告、技术报告等),在采用的时候并没有准确标注引用信息。确标注引用信息。J2EE教程 Session BeanJ2EE教程教程第第3章章 Session BeanJ2EE教程 Session Beann分布式系统:分布式系统:q程序运行在不同的地址空间程序运行在不同的地址空间(通常是不同的主机上通常是不同的主机上)q进程之间的通信是分布式系统的一个基本问题进程之间的通信是分
2、布式系统的一个基本问题程序A程序BJ2EE教程 Session Bean内容提要内容提要n3.1 SOCKETn3.2 RPCn3.3 RMIn3.4 Session Beann3.5 小结小结J2EE教程 Session Bean3.1 SOCKETnSocket 是一个基本的通信机制是一个基本的通信机制nSocket是应用层与是应用层与TCP/IP协议族通信的中间协议族通信的中间软件抽象层,它是一组接口。软件抽象层,它是一组接口。nSocket把复杂的把复杂的TCP/IP协议族隐藏在协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是接口后面,对用户来说,一组简单的接口就是全部
3、,让全部,让Socket去组织数据,以符合指定的去组织数据,以符合指定的协议。协议。 J2EE教程 Session BeanJ2EE教程 Session BeanJ2EE教程 Session Beann优势:优势:q功能强大功能强大n挑战:挑战:q过于底层,涉及一套复杂的流程,要求每个应用的过于底层,涉及一套复杂的流程,要求每个应用的客户端和服务器端都参与到一套复杂的应用层协议客户端和服务器端都参与到一套复杂的应用层协议中;中;q程序代码量多,容易出错且难以调试。程序代码量多,容易出错且难以调试。J2EE教程 Session Bean3.2 RPCn最初由最初由 Sun 微系统提出微系统提出
4、RFC( 1984年年Birrell和和Nelson的一篇论文中提出?的一篇论文中提出?),),并应用于并应用于Unix系统系统nIETF ONC 宪章重新修订了宪章重新修订了Sun版本,使得版本,使得ONC RPC协议成为协议成为IETF标准协议标准协议n现在使用最普遍的模式和执行是现在使用最普遍的模式和执行是The Open Group组织组织(前身为前身为OSF,开放式软件基金,开放式软件基金)的的分布式计算环境(分布式计算环境(DCE)J2EE教程 Session BeannRPC的基本想法的基本想法q目的是允许程序目的是允许程序(Client)调用驻留在其他机调用驻留在其他机器上的过
5、程器上的过程(Server)q并且使远程的过程调用看起来和本地的过程并且使远程的过程调用看起来和本地的过程调用没有区别调用没有区别nRPC的做法是引入存根(的做法是引入存根(Stub)的概念)的概念J2EE教程 Session Beann若服务端有某个函数若服务端有某个函数fn(),为了能够被远程调用,需,为了能够被远程调用,需要通过编译器生成两个要通过编译器生成两个stub: q客户端的一个客户端的一个stub:c_fn()q服务器端的一个服务器端的一个stub:s_fn() J2EE教程 Session BeanRPCRPC比比LPCLPC复杂复杂n操作系统:运行调用和被调用进程的计算操作
6、系统:运行调用和被调用进程的计算机可能有明显不同的体系结构和数据表示机可能有明显不同的体系结构和数据表示格式;格式;n网络通信:调用进程和被调用进程间的网网络通信:调用进程和被调用进程间的网络比本地计算机有更复杂的特性。例如,络比本地计算机有更复杂的特性。例如,它可能限制消息尺寸,并且有丢失和重排它可能限制消息尺寸,并且有丢失和重排消息的可能,安全问题;消息的可能,安全问题;n编程语言:跨语言之间的互操作问题;编程语言:跨语言之间的互操作问题;J2EE教程 Session BeanJ2EE教程 Session BeannStub的对要发送的参数进行的对要发送的参数进行marshal(可理解可理
7、解成一种打包操作成一种打包操作)和对接受到的参数(或返回和对接受到的参数(或返回值)进行值)进行unmarshal(解包解包)。qMarshal操作将要发送的数据制成一种标准的格式操作将要发送的数据制成一种标准的格式(在(在DCE RPC系统中,此格式称做系统中,此格式称做Network Data Representation(NDR)格式)格式)qunmarshal再从再从NDR格式数据包中读出所需数据格式数据包中读出所需数据n该标准格式该标准格式屏蔽了计算机体系结构和数据表屏蔽了计算机体系结构和数据表示格式的差异示格式的差异J2EE教程 Session BeannClient stub的功
8、能:的功能:q收集调用远程函数需要的参数收集调用远程函数需要的参数q将这些参数将这些参数marshal成消息,即把消息转化成标准的网成消息,即把消息转化成标准的网络数据表示络数据表示(network data representation , NDR) 格格式,用于在网络上传递式,用于在网络上传递q调用客户端的运行时系统(调用客户端的运行时系统(Client runtime system)将此消息发送给服务器端。将此消息发送给服务器端。q当服务器端将结果消息返回后,将结果消息当服务器端将结果消息返回后,将结果消息unmarshal,把结果返回给应用进程。,把结果返回给应用进程。nServer
9、stub的功能:的功能:q对发送给它的参数消息对发送给它的参数消息unmarshal,收集参数,收集参数q调用位于本机上的过程调用位于本机上的过程q将此过程执行的结果将此过程执行的结果marshal成消息,然后调用服务器成消息,然后调用服务器端的运行时系统将结果消息发送给客户端端的运行时系统将结果消息发送给客户端J2EE教程 Session BeanJ2EE教程 Session Beann客户端的运行系统客户端的运行系统q将客户端将客户端stub产生的消息产生的消息可靠可靠的传送给的传送给serverq利用利用TCP/UDP等协议,将消息发送到等协议,将消息发送到Servern服务端的运行时系
10、统服务端的运行时系统q侦听某个众所周知的侦听某个众所周知的socket端口,接受请求端口,接受请求q调用调用Server Stub,处理接收到的消息,处理接收到的消息n运行系统提供了可靠的数据传输运行系统提供了可靠的数据传输J2EE教程 Session BeanIDLJ2EE教程 Session BeannInterface definition file 是一个接口文件,它是一个接口文件,它应该由用户利用应该由用户利用IDL(interface definition language)语言编辑而成。语言编辑而成。nIDL是一种用来说明操作(过程或函数),操是一种用来说明操作(过程或函数),操
11、作的参数以及数据类型的语言,它在语法上继作的参数以及数据类型的语言,它在语法上继承于承于C语言,但形式上和语言,但形式上和C语言有很多不同。语言有很多不同。nIDL屏蔽了编程语言的差异屏蔽了编程语言的差异J2EE教程 Session BeanJ2EE教程 Session Bean3.3 RMInRemote Method Invocation(RMI)n出现于出现于Jdk1.1 (1997.02),在,在Jdk1.2中改进中改进n定位:定位:qAccess to Remote ObjectsqClient-Server ProtocolqHigh-level APIqJava-to-Java
12、onlyqTransparentqLightweightJ2EE教程 Session Bean从从RPC到到RMIn变化:变化:q从过程从过程面向对象面向对象q从函数调用从函数调用对实例的操作对实例的操作n问题:问题:q动态绑定问题动态绑定问题取得实例的引用取得实例的引用q接口接口ClientSend()ServerEcho()Server_StubEcho() Server_StubEcho() objobjJ2EE教程 Session BeanStub ObjectServerRemote Objectpublic interface Adder extends Remote public
13、 int add(int x, int y) throws RemoteException;Remote InterfaceRMIRegistryJ2EE教程 Session Bean3.4 Session BeannRMIqStatelessq远程对象总是存在,使用者通过远程对象总是存在,使用者通过naming取取得远程对象的引用得远程对象的引用q由服务提供者控制由服务提供者控制Remote Object的创建和的创建和销毁销毁n企业级应用要求企业级应用要求“远程对象远程对象”:q会话会话, 管理管理(持久化持久化, 生命周期生命周期) , 安全安全, 事务事务J2EE教程 Session
14、BeannSession Bean:q让让remote service(即即Session Bean)实现实现javax.ejb.SessionBean接口接口q由由EJB容器容器利用利用SessionBean接口管理接口管理Session Bean的生的生命周期(初始化、销毁、钝化等)命周期(初始化、销毁、钝化等)qEJB容器截获远程调用请求,将请求转发给容器截获远程调用请求,将请求转发给Session BeanqEJB容器在这个过程中插入容器在这个过程中插入/实现安全、事务和持久化等处理实现安全、事务和持久化等处理J2EE教程 Session BeanSession Bean and RM
15、IServerContainerRemote ObjectClientEJB(1) Call .Create()(2) Call business methodsRMINaming and Diretory Service(n)(1)(n)Home StubRemote StubObjectRemote InterfaceHome Interfacejavax.ejb.SessionBeanHomeObjectJNDIClientJNDIlookupJ2EE教程 Session BeanEJB容器容器J2EE教程 Session Beann在部署在部署EJB时,容器会为每个时,容器会为每个EJ
16、B:q根据根据Home接口产生接口产生Home Objectq生成生成stub和和skeletonq根据部署描述符设置安全环境、事务环境根据部署描述符设置安全环境、事务环境q在在JNDI名称空间中注册名称空间中注册EJB包括包括Home接口、资源引用等接口、资源引用等J2EE教程 Session Beann客户端在访问客户端在访问EJB时:时:q通过通过JNDI查找到查找到Home Object的引用的引用q通过通过Home Interface上的上的create方法创建一个方法创建一个Remote ObjectqHome Object会创建并返回一个会创建并返回一个Remote Object
17、q调用调用Remote Interface上的商业方法上的商业方法qRemote Object截取调用进行处理,然后委托截取调用进行处理,然后委托Bean Class完完成商业方法成商业方法qRemote Object截取截取Bean Class的返回进行处理,然后将结的返回进行处理,然后将结果返回给客户端果返回给客户端J2EE教程 Session BeannBean Class在执行商业方法时可以访问容器:在执行商业方法时可以访问容器:q可以通过可以通过EJBContext对象(它是对容器的直接引用)对象(它是对容器的直接引用)请求关于环境的信息:如请求关于环境的信息:如Client的身份、
18、事务的状态的身份、事务的状态以及自身的引用。以及自身的引用。q可以通过可以通过JNDI访问资源,如访问资源,如JDBC连接、其它的连接、其它的EJB等。等。J2EE教程 Session Beann容器在管理容器在管理EJB生命周期过程中,通过回调方法通知生命周期过程中,通过回调方法通知EJB状态的变化:状态的变化:qBean Class实现并响应这些回调方法,进行相应的处理。实现并响应这些回调方法,进行相应的处理。q不同类型的不同类型的EJB回调方法各不相同,如回调方法各不相同,如Session Bean包括:包括:ejbCreate;ejbRemove;ejbPassivate;ejbAct
19、ivate 。J2EE教程 Session Bean参考文献参考文献n揭开揭开Socket编程的面纱编程的面纱, nDistributed Systems:Concepts and Design, George Coulouris, Jean Dollimore & Tim Kindberg, 1994n对分布计算系统的探究对分布计算系统的探究, wbright, 2002.02 nJava Remote Method Invocation Specification, Sun Microsystems, 1997nJava Remote Method Invocation (RMI), Al
20、exander Day Chaffee, 1997, nEnterprise JavaBeansTM Specification, Version 2.0, Sun Microsystems, 2001.8nMastering Enterprise JavaBeansTM, Ed.Roman, 2002nJ2EE Course, (无法找到出处)(无法找到出处)J2EE教程 Session BeanThe End!J2EE教程 Session BeanCopyright ?1997 Alex Chaffee1. 远程对象(远程对象(Remote Objects)nRemote Objectsq
21、Live on serverqAccessed as if they were localRemote Reference LayerTransport LayerJVMClient ObjectRemote Reference LayerTransport LayerJVMStubRemote ObjectSkeletonJ2EE教程 Session BeanCopyright ?1997 Alex Chaffeen远程接口(远程接口(Remote Interfaces)qDeclare exposed methodsqImplemented on clientqLike a proxy f
22、or the remote objectimport java.rmi.*;public interface Adder extends Remote public int add(int x, int y) throws RemoteException;J2EE教程 Session BeanCopyright ?1997 Alex Chaffee开发远程对象开发远程对象nDefine a Remote Interfaceqextends java.rmi.RemotenDefine a class that qimplements the Remote Interfaceqextends j
23、ava.rmi.RemoteObjector java.rmi.UnicastRemoteObjectJ2EE教程 Session BeanCopyright ?1997 Alex ChaffeeRemote Class Exampleimport java.rmi.*;import java.rmi.server.*;public class AdderImpl extends UnicastRemoteObject implements Adder public AdderImpl() throws RemoteException public int add(int x, int y)
24、throws RemoteException return x + y; J2EE教程 Session BeanCopyright ?1997 Alex Chaffee2. Stubs and SkeletonsnStub qlives on clientqpretends to be remote objectRemote Reference LayerTransport LayerJVMClient ObjectRemote Reference LayerTransport LayerJVMStubRemote ObjectSkeletonnSkeletonqlives on server
25、qreceives requests from stubqtalks to true remote objectqdelivers response to stubJ2EE教程 Session BeanCopyright ?1997 Alex ChaffeeCompiling Remote Classes (Diagram)Adder.java(interface)Adder.class(interface classfile)javacAdderImpl.java(remote class)AdderImpl.class(classfile)javacrmicAdderImpl_Skel.c
26、lass(skeleton classfile)AdderImpl_Stub.class(stub classfile)Stubs和和skeletons 利用利用rmic编译器产生编译器产生J2EE教程 Session BeanCopyright ?1997 Alex ChaffeeRemote Interfaces and StubsRemote InterfaceStubRemote Object(Server)ClientSkeletonimplementsimplementsnStub和和skeleton类是在运行时确定,并动态类是在运行时确定,并动态加载的加载的J2EE教程 Sess
27、ion BeannStub的职责:发起对远程对象的调用的职责:发起对远程对象的调用 (通过调通过调用用remote reference layer)qMarshaling arguments to a marshal stream (employ a mechanism called object serialization)qInforming the remote reference layer that the call should be invoked.qUnmarshaling the return value or exception from a marshal stream.
28、qInforming the remote reference layer that the call is complete.J2EE教程 Session BeannThe skeleton is responsible for:qUnmarshaling arguments from the marshal stream.qMaking the up-call to the actual remote object implementation.qMarshaling the return value of the call or an exception (if one occurred
29、) onto the marshal stream.J2EE教程 Session BeanCopyright ?1997 Alex Chaffee3. Remote Reference Layern提供了提供了RemoteRef对象,代表远程服务实现的链对象,代表远程服务实现的链接接 (指出引用了哪个远程对象指出引用了哪个远程对象)nStub对象利用对象利用 RemoteRef的的invoke()方法传递方方法传递方法调用法调用nremote reference layer和底层的传输接口交互和底层的传输接口交互Remote Reference LayerTransport LayerJVMC
30、lient ObjectRemote Reference LayerTransport LayerJVMStubRemote ObjectSkeletonJ2EE教程 Session BeanCopyright ?1997 Alex Chaffee4. Transport LayernDeals with communicationsnConnection managementnDispatching messages between stub and skeletonnDistributed Garbage CollectionnSits on top of Remote Reference
31、 LayerTransport LayerJVMClient ObjectRemote Reference LayerTransport LayerJVMStubRemote ObjectSkeletonJ2EE教程 Session BeannRMI系统传输层的职责:系统传输层的职责:q设置到远程地址空间的连接设置到远程地址空间的连接q管理连接管理连接q监控连接状态(监控连接状态(“liveness.”)q侦听调用请求侦听调用请求q维护地址空间内的远程对象列表维护地址空间内的远程对象列表q设置调用请求的连接设置调用请求的连接q定位远程调用目标对象的分配器(定位远程调用目标对象的分配器(disp
32、atcher),),将连接传给该分配器将连接传给该分配器J2EE教程 Session BeanCopyright ?1997 Alex Chaffee5. Registriesn命名和查找远程对象命名和查找远程对象n服务器可以注册它们的对象服务器可以注册它们的对象n客户端可以发现服务对象并且获取远程引用客户端可以发现服务对象并且获取远程引用n 注册器是运行在主机上的进程注册器是运行在主机上的进程J2EE教程 Session BeanRMI RegistrynRMI包含了一个简单的目录服务,称为包含了一个简单的目录服务,称为RMI Registry, 它它q运行在每个有远程服务对象的主机上运行在
33、每个有远程服务对象的主机上q接受服务查询请求,缺省端口是接受服务查询请求,缺省端口是1099.(object servers will be dynamically assigned ports by the RMI runtime)q支持支持stub代码的动态下载代码的动态下载J2EE教程 Session Bean使用使用RMI RegistrynServer-sideq创建一个实现远程服务的本地对象创建一个实现远程服务的本地对象q导出该对象给导出该对象给RMI (创建一个侦听服务,等待客户创建一个侦听服务,等待客户端的连接端的连接).q用一个公开的名称,将该对象注册到用一个公开的名称,将该
34、对象注册到RMI Registry中中J2EE教程 Session BeannClient-sideq通过通过java.rmi.Naming 静态类访问静态类访问RMI Registryq使用方法使用方法lookup()查询注册器,参数是查询注册器,参数是URL: rmi:/:/ 该方法返回服务对象的远程引用该方法返回服务对象的远程引用J2EE教程 Session BeanCopyright ?1997 Alex ChaffeeRMI例子例子nRMI系统由以下几个部分组成:系统由以下几个部分组成:q远程服务的接口定义远程服务的接口定义(Remote Interface)q远程服务的实现远程服务
35、的实现(Remote Service)qStub和和Skeleton文件文件qRMI命名服务,使得客户端可以发现远程服务命名服务,使得客户端可以发现远程服务q运行远程服务的服务器运行远程服务的服务器q需要远程服务的客户端程序需要远程服务的客户端程序J2EE教程 Session BeannRMI编程编程q编写并编译接口的编写并编译接口的Java代码代码(adder.java)q编写并编写并编译编译实现类的实现类的Java代码代码q利用利用RMIC从实现类产生从实现类产生Stub和和Skeleton类文件类文件q启动注册服务启动注册服务q编写远程服务主机编写远程服务主机(host)程序的程序的Ja
36、va代码代码,运行之运行之q开发开发RMI客户端程序的客户端程序的Java代码代码,运行之运行之J2EE教程 Session Bean小结小结n从从RPC到到RMIq增加了增加了Interface,对应于,对应于DCE RPC中的中的IDLq编译之后得到的是编译之后得到的是stub + skeletonq增加了对象的创建增加了对象的创建(服务器服务器)q增加了:注册和检索增加了:注册和检索J2EE教程 Session BeanJ2EE教程 Session BeanSession Bean和和Container的的契约契约nBean提供者在提供者在EJB类中实现业务方法类中实现业务方法n容器提供
37、者将客户端的函数调用委派给容器提供者将客户端的函数调用委派给EJB的函的函数数nBean提供者提供者ejbCreate, ejbPostCreate和和 ejbRemoven容器提供者在容器提供者在EJB对象创建、移除和查找的时候对象创建、移除和查找的时候调用这些方法调用这些方法J2EE教程 Session BeannBean提供者定义提供者定义EJB home和业务接口和业务接口n容器提供者提供实现这些接口的类容器提供者提供实现这些接口的类nBean提供者实现提供者实现javax.ejb.SessionBean(以以及可选的及可选的javax.ejb.SessionSynchronizati
38、on)接口中接口中定义的容器回调函数定义的容器回调函数n容器应该在合适的时间调用这些回调函数。容器应该在合适的时间调用这些回调函数。J2EE教程 Session Beann容器提供者提供容器提供者提供javax.ejb.SessionContext接口接口给会话给会话Bean实例。该接口使得实例能够从容器得实例。该接口使得实例能够从容器得到上下文信息到上下文信息nThe requirement for the Container to provide to the bean instances the JNDI context that contains the enterprise bean
39、s environment.n容器为容器为EJB实例管理事务、安全、异常。实例管理事务、安全、异常。nBean提供者在编程时应该避免破坏容器对提供者在编程时应该避免破坏容器对EJB实实例的运行时管理。例的运行时管理。J2EE教程 Session BeanEJB的特征的特征n通常包含业务逻辑,处理业务数据通常包含业务逻辑,处理业务数据.nEJB的实例由容器在运行时创建和管理的实例由容器在运行时创建和管理nEJB可以在部署时定制可以在部署时定制n不同的服务信息(例如安全、事务)与不同的服务信息(例如安全、事务)与EJB类类是分开的。这使得可以在应用装配和部署的时是分开的。这使得可以在应用装配和部署的时候通过工具管理服务信息候通过工具管理服务信息n客户端的访问由部署了客户端的访问由部署了EJB的容器间接传递给的容器间接传递给该该EJB。J2EE教程 Session Bean