《高级软件工程》PPT课件.ppt
高级软件工程高级软件工程构件运行环境构件运行环境 1/76第第 十十 讲讲构件运行环境构件运行环境1构件运行环境构件运行环境 2/76高级软件工程高级软件工程构件运行环境对于软件构件的重要性构件运行环境对于软件构件的重要性完全类似于操作系统对作业的重要性完全类似于操作系统对作业的重要性构件运行环境的出现构件运行环境的出现甚至正在改变网络软件的高层运行模式甚至正在改变网络软件的高层运行模式 2构件运行环境构件运行环境 3/76高级软件工程高级软件工程内内 容容n概述概述n构件容器的功能构件容器的功能n容器与实现体的合作容器与实现体的合作n会话构件实例的管理会话构件实例的管理n实体构件实例的管理实体构件实例的管理3构件运行环境构件运行环境 4/76高级软件工程高级软件工程一、概述一、概述从运行环境角度看面向对象技术与构件技术从运行环境角度看面向对象技术与构件技术1、构件上下文、构件上下文2、构件容器、构件容器3、构件约束、构件约束1构件运行环境主要关心哪些问题?构件运行环境主要关心哪些问题?4构件运行环境构件运行环境 5/76高级软件工程高级软件工程1、构件上下文、构件上下文我们日常生活中的任何语言都有一定的上下文(语境)我们日常生活中的任何语言都有一定的上下文(语境)同样一句话同样一句话由不同的人说出来由不同的人说出来 其含义可能不同其含义可能不同由同一个人说出来由同一个人说出来 但由不同的人听起来其含义也可能不同但由不同的人听起来其含义也可能不同完全相同的听说两个人完全相同的听说两个人 在不同的环境中说的相同一句话在不同的环境中说的相同一句话 含义也可能不同含义也可能不同不同的地点、不同的时间、不同的旁听者等不同的地点、不同的时间、不同的旁听者等共同构成了语言的语境共同构成了语言的语境5构件运行环境构件运行环境 6/76高级软件工程高级软件工程在网络环境中在网络环境中 一个计算过程(构件)受环境的影响很大一个计算过程(构件)受环境的影响很大例如:例如:客户的身份客户的身份服务体能提供的访问带宽服务体能提供的访问带宽客户的请求方式客户的请求方式 等等都会对构件的具体服务方式产生影响都会对构件的具体服务方式产生影响例如:例如:是否为客户提供服务是否为客户提供服务提供何种精度的服务提供何种精度的服务使用什么样的交互协议使用什么样的交互协议 等等上述影响构件服务效果的各种因素上述影响构件服务效果的各种因素都被认为是构件的上下文都被认为是构件的上下文构件运行环境需要构件运行环境需要为构件获取这些信息为构件获取这些信息并帮助构件做出适当的反应并帮助构件做出适当的反应6构件运行环境构件运行环境 7/76高级软件工程高级软件工程2、构件容器、构件容器在编程语言中在编程语言中 每个数据对象都是数据值的容器每个数据对象都是数据值的容器COM套间通过线程模型将不同的对象分割到不同的运行空间中套间通过线程模型将不同的对象分割到不同的运行空间中使得它们的运行相对独立使得它们的运行相对独立MTS引入了事务性上下文概念引入了事务性上下文概念共享相同事务域的多个对象处于同一个线程中共享相同事务域的多个对象处于同一个线程中这同样将它们与系统的其他部分隔离开来这同样将它们与系统的其他部分隔离开来在在.NET的的CLR中同时吸取了中同时吸取了COM与与MTS中的上述技术中的上述技术跨越上下文的访问被执行引擎所控制跨越上下文的访问被执行引擎所控制并可能进行一些特殊处理并可能进行一些特殊处理EJB模型中的容器概念比较完善模型中的容器概念比较完善除了除了 采用类加载器分别加载不同的构件外采用类加载器分别加载不同的构件外EJB容器还为容器还为EJB构件实例承担了构件实例承担了记录上下文、控制生命周期、控制对实例的访问等任务记录上下文、控制生命周期、控制对实例的访问等任务 7构件运行环境构件运行环境 8/76高级软件工程高级软件工程3、构件约束、构件约束构件约束是关于构件所实现功能的约束构件约束是关于构件所实现功能的约束这些约束传统上被编写到构件代码中这些约束传统上被编写到构件代码中但由于这样往往导致系统约束性需求的实现但由于这样往往导致系统约束性需求的实现分布在不同的构件代码中分布在不同的构件代码中不利于约束需求的演化不利于约束需求的演化可以利用一些新技术可以利用一些新技术将构件约束的实现与构件的功能代码进行分离将构件约束的实现与构件的功能代码进行分离以便于对这些约束进行统一实施以便于对这些约束进行统一实施截取器即是针对上述问题的一种解决实现机制截取器即是针对上述问题的一种解决实现机制8构件运行环境构件运行环境 9/76高级软件工程高级软件工程截取器是一种十分重要的设计模式截取器是一种十分重要的设计模式用于在构件接收消息与发送消息过程中对消息进行截取用于在构件接收消息与发送消息过程中对消息进行截取以进行必要的加工或处理以进行必要的加工或处理例如:例如:在构件为客户的请求进行服务之前在构件为客户的请求进行服务之前检查安全上下文,以决定是否为构件服务检查安全上下文,以决定是否为构件服务检查事务上下文,以决定为构件提供什么样的可靠性支持检查事务上下文,以决定为构件提供什么样的可靠性支持对客户的请求进行记录,以供将来分析系统的运行状况对客户的请求进行记录,以供将来分析系统的运行状况在构件为客户的请求进行服务之后在构件为客户的请求进行服务之后检查结果返回值,确认返回值的有效性等检查结果返回值,确认返回值的有效性等通过引入构件截取器通过引入构件截取器可以将构件代码中与业务逻辑无关的约束性内容剥离出来可以将构件代码中与业务逻辑无关的约束性内容剥离出来由截取器与一些公共服务互相配合由截取器与一些公共服务互相配合共同完成构件约束性需求的实现共同完成构件约束性需求的实现这不仅使构件代码更为简洁这不仅使构件代码更为简洁还提高了应用系统的适应性还提高了应用系统的适应性9构件运行环境构件运行环境 10/76高级软件工程高级软件工程二、构件容器的功能二、构件容器的功能 网络环境中的软件必须考虑客户访问量问题网络环境中的软件必须考虑客户访问量问题一个拥有大量用户的系统可能需要同时运行成千上万的对象一个拥有大量用户的系统可能需要同时运行成千上万的对象如果不控制系统资源的使用如果不控制系统资源的使用 将使系统将使系统因为资源不足而大大降低响应时间因为资源不足而大大降低响应时间甚至导致系统不可用甚至导致系统不可用应用服务器通过容器对大量构件实例的有效管理应用服务器通过容器对大量构件实例的有效管理来提高系统的资源利用率来提高系统的资源利用率所依赖的主要机制为所依赖的主要机制为:实例池实例池冻化冻化/活化活化生命周期管理等生命周期管理等 10构件运行环境构件运行环境 11/76高级软件工程高级软件工程1、实例池、实例池实例池技术是系统软件中普遍使用的共享技术实例池技术是系统软件中普遍使用的共享技术其核心思想是将暂时不用的资源实例缓存起来其核心思想是将暂时不用的资源实例缓存起来放到实例池中放到实例池中当下一个客户需要访问资源时当下一个客户需要访问资源时 直接从实例池中取出来为客户服务直接从实例池中取出来为客户服务实例池技术带来的好处主要有两方面:实例池技术带来的好处主要有两方面:其一,有效地减少对实例频繁的创建与删除工作其一,有效地减少对实例频繁的创建与删除工作 提高了响应速度提高了响应速度其二,通过设定实例池的大小其二,通过设定实例池的大小 可以限制访问客户的数目可以限制访问客户的数目以保证正在访问客户的服务质量以保证正在访问客户的服务质量 实现构件实例池的基本方法是:实现构件实例池的基本方法是:在加载系统时,为一个构件类型创建多个实例。在加载系统时,为一个构件类型创建多个实例。当一个客户提出请求时,从实例池中提取构件实例当一个客户提出请求时,从实例池中提取构件实例建立起与客户的关联建立起与客户的关联当客户不再需要构件服务时,将实例放回实例池当客户不再需要构件服务时,将实例放回实例池11构件运行环境构件运行环境 12/76高级软件工程高级软件工程2、冻化、冻化/活化活化有态构件不同于无态构件的地方在于:有态构件不同于无态构件的地方在于:有态构件保持一个业务过程中前后方法调用之间的状态有态构件保持一个业务过程中前后方法调用之间的状态这个状态代表着有态构件实例与其客户之间的一个对话这个状态代表着有态构件实例与其客户之间的一个对话对有态构件实例进行有效资源管理的技术是冻化、活化技术对有态构件实例进行有效资源管理的技术是冻化、活化技术当一个构件实例的访问频率较低当一个构件实例的访问频率较低 而此时又有大量客户需要服务时而此时又有大量客户需要服务时可以将这个有态构件实例挂起可以将这个有态构件实例挂起 以减少系统中构件实例的数目以减少系统中构件实例的数目挂起有态构件的实例需要保持其话态,实例的状态将被序列化挂起有态构件的实例需要保持其话态,实例的状态将被序列化序列化构件实例时序列化构件实例时 除了需要将该实例从内存中暂时删除外除了需要将该实例从内存中暂时删除外还需要将该实例的状态保存到外存中(例如一个文件系统等)还需要将该实例的状态保存到外存中(例如一个文件系统等)当这个实例的客户再次访问该实例时当这个实例的客户再次访问该实例时 容器将首先构造一个新实例容器将首先构造一个新实例 然后从外存中取出实例的状态然后从外存中取出实例的状态并恢复实例的状态并恢复实例的状态冻化冻化/活化技术也适用于实体构件活化技术也适用于实体构件 12构件运行环境构件运行环境 13/76高级软件工程高级软件工程3、生命周期管理、生命周期管理构件的实现体一般随着应用系统的部署被加载到应用服务器中构件的实现体一般随着应用系统的部署被加载到应用服务器中被构件容器所管理被构件容器所管理例如:创建构件实例例如:创建构件实例查找构件实例查找构件实例删除构件实例删除构件实例接收客户请求消息接收客户请求消息 等等构件的生命周期管理主要是指构件实例的生命周期管理构件的生命周期管理主要是指构件实例的生命周期管理 13构件运行环境构件运行环境 14/76高级软件工程高级软件工程三、容器与实现体的合作三、容器与实现体的合作 为了完成客户的请求为了完成客户的请求构件容器与构件实现体必须进行很好地分工与协作:构件容器与构件实现体必须进行很好地分工与协作:如果请求与类型接口中的方法相对应如果请求与类型接口中的方法相对应则主要由构件容器负责则主要由构件容器负责进行构件的创建、查找、删除等操作进行构件的创建、查找、删除等操作尽管最终可能还是需要构件实现体的介入尽管最终可能还是需要构件实现体的介入如果请求与实例接口中的方法相对应如果请求与实例接口中的方法相对应则说明这是与构件业务逻辑相关的请求则说明这是与构件业务逻辑相关的请求必须由构件实现体进行服务必须由构件实现体进行服务容器将代理客户向构件实现体发送这些业务请求容器将代理客户向构件实现体发送这些业务请求1、构件实现体向容器提供的方法、构件实现体向容器提供的方法2、容器向构件实现体提供的方法、容器向构件实现体提供的方法 3、构件实现体与构件接口的方法、构件实现体与构件接口的方法14构件运行环境构件运行环境 15/76高级软件工程高级软件工程1、构件实现体向容器提供的方法、构件实现体向容器提供的方法容器是构件的容器是构件的“操作系统操作系统”构件实现体所有的方法都是通过容器发生作用的构件实现体所有的方法都是通过容器发生作用的这些方法可以被大体分为两类这些方法可以被大体分为两类一类是通过容器提供给客户的一类是通过容器提供给客户的另一类是专门提供给容器以供管理的另一类是专门提供给容器以供管理的后者包括:基本接口后者包括:基本接口EnterpriseBean用于定义会话构件的接口用于定义会话构件的接口SessionBean用于定义实体构件的接口用于定义实体构件的接口EntityBean以及对于会话构件可选的接口以及对于会话构件可选的接口SessionSynchronization2EJB构件与构件运行环构件与构件运行环境之间的接口有哪些?境之间的接口有哪些?15构件运行环境构件运行环境 16/76高级软件工程高级软件工程EnterpriseBean只表明任何构件都是可序列化的:只表明任何构件都是可序列化的:package javax.ejb;import;public interface EnterpriseBean extends Serializable16构件运行环境构件运行环境 17/76高级软件工程高级软件工程所有会话构件必须实现所有会话构件必须实现SessionBean接口:接口:package javax.ejb;import;public interface SessionBean extends EnterpriseBean public abstract void ejbActivate()throws EJBException,RemoteException;public abstract void ejbPassivate()throws EJBException,RemoteException;public abstract void ejbRemove()throws EJBException,RemoteException;public abstract void setSessionContext(SessionContext sessioncontext)throws EJBException,RemoteException;17构件运行环境构件运行环境 18/76高级软件工程高级软件工程lsetSessionContext 将当前会话构件实例与由容器管理的将当前会话构件实例与由容器管理的Context(事务(事务Context、安全、安全Context 等)进行关联等)进行关联 并将其作为话态的一部分并将其作为话态的一部分lejbRemove 用于由容器将构件实例删除用于由容器将构件实例删除ejbRemove方法与方法与ejbPassivate释放的资源基本一样释放的资源基本一样lejbPassivate 用于由容器冻化实例用于由容器冻化实例lejbActivate 用于由容器活化实例用于由容器活化实例 由于容器自动利用由于容器自动利用Java语言的序列化机制进行冻化、活化过程语言的序列化机制进行冻化、活化过程 上述操作在构件开发过程中大多数可忽略上述操作在构件开发过程中大多数可忽略18构件运行环境构件运行环境 19/76高级软件工程高级软件工程对于会话构件:可选的对于会话构件:可选的SessionSynchronization接口接口package javax.ejb;import;public interface SessionSynchronization public abstract void afterBegin()throws.;public abstract void afterCompletion(boolean flag)throws.;public abstract void beforeCompletion()throws.;19构件运行环境构件运行环境 20/76高级软件工程高级软件工程会话构件可以有选择性地实现会话构件可以有选择性地实现SessionSynchronization接口接口这个接口提供了一些同步通告这个接口提供了一些同步通告实例可以用这些方法在事务中管理数据的缓冲等实例可以用这些方法在事务中管理数据的缓冲等afterBegin方法用于标明方法用于标明 新事务的开始新事务的开始container在事务内的第一个在事务内的第一个business方法前调用它方法前调用它beforeCompletion方法用于标明方法用于标明 客户已经完成当前事务的工作客户已经完成当前事务的工作 但是还没有提交给实例使用的资源管理者但是还没有提交给实例使用的资源管理者 此时实例应该写出缓冲的数据此时实例应该写出缓冲的数据 实例可在实例可在session context中调用中调用setRollbackOnly来来卷回原来状态卷回原来状态afterCompletion方法用于标明当前方法用于标明当前transaction已经结束已经结束结束状态结束状态true表示已提交表示已提交 false表示已卷回表示已卷回因为会话构件实例的话态不是事务性的因为会话构件实例的话态不是事务性的卷回后需要手动调整它的状态卷回后需要手动调整它的状态 20构件运行环境构件运行环境 21/76高级软件工程高级软件工程关于关于SessionSynchronization:所有容器提供者必须支持所有容器提供者必须支持SessionSynchronization它仅只对构件实现者可选它仅只对构件实现者可选.只有容器管理事务的有态会话构件只有容器管理事务的有态会话构件 可以实现可以实现SessionSynchronization;无态会话构件不允许实现无态会话构件不允许实现SessionSynchronization。构件管理事务的会话构件不必依赖构件管理事务的会话构件不必依赖SessionSynchronization因为构件自身管理事务因为构件自身管理事务 不必向容器提供同步机制不必向容器提供同步机制21构件运行环境构件运行环境 22/76高级软件工程高级软件工程package javax.ejb;import;public interface EntityBean extends EnterpriseBean public abstract void setEntityContext(EntityContext entitycontext)throws;public abstract void unsetEntityContext()throws;public abstract void ejbActivate()throws;public abstract void ejbPassivate()throws;public abstract void ejbLoad()throws;public abstract void ejbStore()throws;public abstract void ejbRemove()throws;所有实体构件必须实现所有实体构件必须实现EntityBean接口:接口:22构件运行环境构件运行环境 23/76高级软件工程高级软件工程lsetEntityContext 将当前实体构件实例与由容器管理的将当前实体构件实例与由容器管理的Context进行关联进行关联实例通过它获取所需的资源(事务服务、安全服务等)实例通过它获取所需的资源(事务服务、安全服务等)这种资源不特定于某一个标识这种资源不特定于某一个标识lunsetEntityContext 用于终止一个实例的生命周期用于终止一个实例的生命周期实例通过它释放实例通过它释放setEntityContext获取的资源获取的资源lejbActivate 容器调用该方法容器调用该方法 从实例池中取出一个实例从实例池中取出一个实例并为其赋予一个特定的实体对象标识并为其赋予一个特定的实体对象标识 实例不能使用该方法从数据库读取实体的状态实例不能使用该方法从数据库读取实体的状态必须用必须用ejbLoad23构件运行环境构件运行环境 24/76高级软件工程高级软件工程l ejbPassivate 容器调用该方法容器调用该方法 将实例与实体对象标识进行分离将实例与实体对象标识进行分离并将实例放回实例池并将实例放回实例池 实例不能使用该方法向数据库存储实体的状态实例不能使用该方法向数据库存储实体的状态必须用必须用ejbStorel ejbLoad通知实例将缓存在实例变量中的实体状态通知实例将缓存在实例变量中的实体状态与数据库中的实体状态同步与数据库中的实体状态同步该方法所处的事务由触发该方法所处的事务由触发ejbLoad方法的业务方法方法的业务方法所处的事务属性所决定所处的事务属性所决定l ejbStore通知实例将数据库中的实体状态通知实例将数据库中的实体状态与缓存在实例变量中的实体状态同步与缓存在实例变量中的实体状态同步该方法所处的事务由以前的该方法所处的事务由以前的 ejbLoad 或 ejbCreate 方法决定方法决定在在 ejbLoad 或者或者 ejbCreate 方法方法与该与该 ejbStore方法之间的所有方法都处于相同的事务中方法之间的所有方法都处于相同的事务中24构件运行环境构件运行环境 25/76高级软件工程高级软件工程2、容器向构件实现体提供的方法、容器向构件实现体提供的方法容器向构件实现体提供的方法主要表现容器向构件实现体提供的方法主要表现为容器向构件实现体提供构件的上下文接口为容器向构件实现体提供构件的上下文接口这是一个与构件实例一一对应的实体这是一个与构件实例一一对应的实体容器向构件实现体提供的具体方法包括:容器向构件实现体提供的具体方法包括:由由EJBContext定义的基本方法定义的基本方法由由SessionContext定义的向会话构件提供的方法定义的向会话构件提供的方法以及由以及由EntityContext定义的向实体构件提供的方法定义的向实体构件提供的方法 25构件运行环境构件运行环境 26/76高级软件工程高级软件工程package javax.ejb;import java.security.Identity;import java.security.Principal;import java.util.Properties;import;public interface EJBContext public abstract Identity getCallerIdentity();public abstract Principal getCallerPrincipal();public abstract EJBHome getEJBHome();public abstract Properties getEnvironment();public abstract boolean getRollbackOnly()throws IllegalStateException;public abstract UserTransaction getUserTransaction()throws IllegalStateException;public abstract boolean isCallerInRole(String s);public abstract boolean isCallerInRole(Identity identity);public abstract void setRollbackOnly()throws IllegalStateException;26构件运行环境构件运行环境 27/76高级软件工程高级软件工程getEJBHome方法返回会话构件的方法返回会话构件的home interfacegetCallerPrincipal方法返回方法返回,标明会话构件实例调用者的标明会话构件实例调用者的EJB对象对象isCallerInRole方法用于测试会话构件实例的调用者是否具有方法用于测试会话构件实例的调用者是否具有某一特定角色某一特定角色setRollbackOnly方法用来标记当前事务方法用来标记当前事务,使其结束时必须卷使其结束时必须卷回,只有容器管理的实例可以使用该方法回,只有容器管理的实例可以使用该方法getRollbackOnly方法用于测试当前事务是否必须卷回,只有方法用于测试当前事务是否必须卷回,只有容器管理的实例可以使用该方法容器管理的实例可以使用该方法getUserTransaction方法返回方法返回UserTransaction接口。实例可以接口。实例可以用这个接口来划分事务和获取事务状态,只有构件管理的实用这个接口来划分事务和获取事务状态,只有构件管理的实例可以使用这个方法例可以使用这个方法27构件运行环境构件运行环境 28/76高级软件工程高级软件工程package javax.ejb;public interface SessionContext extends EJBContext public abstract EJBObject getEJBObject()throws IllegalStateException;package javax.ejb;public interface EntityContext extends EJBContext public abstract EJBObject getEJBObject()throws IllegalStateException;public abstract Object getPrimaryKey()throws IllegalStateException;构件容器必须向会话构件提供构件容器必须向会话构件提供SessionContext接口接口:构件容器必须向实体构件提供构件容器必须向实体构件提供EntityContext接口接口:28构件运行环境构件运行环境 29/76高级软件工程高级软件工程3、构件实现体与构件接口的方法、构件实现体与构件接口的方法 public class ConverterEJB implements SessionBean public double dollarToYen(double dollars)return dollars*121.6000;public double yenToEuro(double yen)return yen*0.0077;public ConverterEJB()public void ejbCreate()public void ejbRemove()public void ejbActivate()public void ejbPassivate()public void setSessionContext(SessionContext sc)仅声明实现了SessionBean接口,类型接口与实例接口呢?29构件运行环境构件运行环境 30/76高级软件工程高级软件工程其一:接口其一:接口Converter扩展了接口扩展了接口EJBObject而而EJBObject的功能是独立于具体构件的(由容器实现)的功能是独立于具体构件的(由容器实现)类类ConverterEJB不必实现接口不必实现接口EJBObject中的方法中的方法如果我们将类如果我们将类ConverterEJB声明为声明为public class ConverterEJB implements SessionBean,Converter 当编译时当编译时 会产生许多针对会产生许多针对EJBObject中方法的错误中方法的错误其二:当构件需要调用其他构件时其二:当构件需要调用其他构件时有时发出请求的构件需要将自身作为参数进行传递有时发出请求的构件需要将自身作为参数进行传递假如假如ConverterEJB需要向另外一个构件发出的一条消息中需要向另外一个构件发出的一条消息中需要将自身作为参数进行传递需要将自身作为参数进行传递编程人员可能想当然地写成编程人员可能想当然地写成someMethod(this)这在网络环境中却是行不通的这在网络环境中却是行不通的必须根据前面介绍的方法必须根据前面介绍的方法getEJBObject 从容器获取引用从容器获取引用 然后传递该引用然后传递该引用30构件运行环境构件运行环境 31/76高级软件工程高级软件工程home接口中若干方法的实现接口中若干方法的实现create methodsfinder methodsRemove methodshome methodsejbCreateejbPostCreateejbFindejbRemoveejbHome 31构件运行环境构件运行环境 32/76高级软件工程高级软件工程lejbCreate当客户利用构件的当客户利用构件的home interface中的中的create创建构件实例时创建构件实例时 容器调用构件实例的容器调用构件实例的ejbCreate方法方法校验客户提供的参数校验客户提供的参数向数据库插入表示实体对象的一条记录向数据库插入表示实体对象的一条记录(例如:发出一句(例如:发出一句SQL语句语句 insert)初始化实例变量初始化实例变量每一个实体构件包含零或多个每一个实体构件包含零或多个ejbCreate方法方法当构件的当构件的home接口未定义接口未定义create方法时方法时该实体构件不包含该实体构件不包含ejbCreate方法方法以限制客户对以限制客户对那些直接通过数据库插入而创建的实体那些直接通过数据库插入而创建的实体 的访问的访问32构件运行环境构件运行环境 33/76高级软件工程高级软件工程l ejbPostCreate 对于每一个对于每一个ejbCreate方法方法有一个有一个 对应的对应的ejbPostCreate方法方法参数与之完全相同参数与之完全相同当容器调用完当容器调用完ejbCreate(.)方法后方法后立即调用立即调用ejbPostCreate方法方法当当调用调用ejbPostCreate 方法时方法时实体对象标识是可获得的实体对象标识是可获得的例如,实例可以获取所关联的实体对象的例如,实例可以获取所关联的实体对象的remote接口接口并将其作为一个参数传送给另一个构件并将其作为一个参数传送给另一个构件ejbPostCreate方法在方法在 与与ejbCreate相同的事务(上下文)中执行相同的事务(上下文)中执行33构件运行环境构件运行环境 34/76高级软件工程高级软件工程l ejbFind当客户调用当客户调用find方法时方法时容器调用该方法容器调用该方法当容器选择一个实例执行当容器选择一个实例执行ejbFind 方法时方法时该实例处于该实例处于pooled 状态状态即未被分配给一个特定的实体对象标识即未被分配给一个特定的实体对象标识当当ejbFind方法结束时方法结束时该实例被返回该实例被返回pooled 状态状态ejbFind 方法所处的事务方法所处的事务由客户的由客户的find方法的事务属性决定方法的事务属性决定ejbFind 方法返回一个主键或者主键的集合方法返回一个主键或者主键的集合34构件运行环境构件运行环境 35/76高级软件工程高级软件工程l ejbRemove 当客户调用当客户调用remove方法时将从数据库中删除实体状态方法时将从数据库中删除实体状态 容器接受容器接受remove方法时调用方法时调用ejbRemove方法方法 将构件实例从将构件实例从ready状态转变为状态转变为pooled状态状态 容器在调用容器在调用ejbRemove方法之前方法之前必须将必须将实例的状态与数据库中的实体状态同步实例的状态与数据库中的实体状态同步否则,首先调用否则,首先调用ejbLoad方法方法 ejbRemove所处的事务由客户的所处的事务由客户的remove方法的事务属性决定方法的事务属性决定 该方法结束时,实例的状态等价于该方法结束时,实例的状态等价于passivated 实例的状态实例的状态 这意味着实例必须象这意味着实例必须象ejbPassivate()那样那样释放所有的资源释放所有的资源35构件运行环境构件运行环境 36/76高级软件工程高级软件工程l ejbHome Home 方法是那些不特定于具体实体构件实例的业务逻辑方法是那些不特定于具体实体构件实例的业务逻辑 例如:计算所有储户的总金额例如:计算所有储户的总金额当客户调用当客户调用home 方法时方法时容器调用任意一个实例上的该方法容器调用任意一个实例上的该方法当容器选择一个实例执行当容器选择一个实例执行ejbHome 方法时方法时该实例处于该实例处于pooled 状态状态即未被分配给一个特定的实体对象标识即未被分配给一个特定的实体对象标识当当ejbHome方法结束时方法结束时该实例被返回该实例被返回pooled 状态状态ejbHome 方法所处的事务方法所处的事务由客户的由客户的home 方法的事务属性决定方法的事务属性决定36构件运行环境构件运行环境 37/76高级软件工程高级软件工程四、会话构件实例的管理四、会话构件实例的管理 会话构件会话构件SessionSynchronizationSessionBeanHomeRemoteSessionContext容器容器37构件运行环境构件运行环境 38/76高级软件工程高级软件工程1、有态构件实例的管理、有态构件实例的管理有态构件是需要为多个方法调用保留话态的有态构件是需要为多个方法调用保留话态的会话构件会话构件话态是特定于某一个具体客户的话态是特定于某一个具体客户的当存在大量的有态构件时当存在大量的有态构件时由于系统资源(内存、数据库连接、网络连接等)有限由于系统资源(内存、数据库连接、网络连接等)有限因此需要将暂时不用的构件进行缓存因此需要将暂时不用的构件进行缓存(pooling)类似于传统操作系统面临的问题!类似于传统操作系统面临的问题!基本算法:基本算法:冻化:冻化:LRU(Least Recently Used)活化:活化:Just-In-Time3有态构件的生有态构件的生命周期是怎样的?命周期是怎样的?38构件运行环境构件运行环境 39/76高级软件工程高级软件工程有态构件的状态转换图有态构件的状态转换图39构件运行环境构件运行环境 40/76高级软件工程高级软件工程l会话构件实例产生于会话构件实例产生于 客户调用客户调用home interface的的 create()方法方法 这引起这引起container调用调用newInstance()、setSessionContext()、ejbCreate()并返回并返回remote引用给客户引用给客户实例进入实例进入method ready状态状态l现在实例可以接受客户的现在实例可以接受客户的business方法方法 根据在根据在deployment descriptor中的中的transaction attribute和客和客户调用的户调用的transaction context业务方法可以在业务方法可以在transaction context中或未指定的中或未指定的transaction context中执行中执行见图中的见图中的tx method和和non-tx method40构件运行环境构件运行环境 41/76高级软件工程高级软件工程l非事务方法在非事务方法在method ready状态下执行状态下执行l事务方法的调用使得实例被包含在一个事务中事务方法的调用使得实例被包含在一个事务中 此时,容器会调用实例的此时,容器会调用实例的afterBegin()实例会与事务结合直到事务结束实例会与事务结合直到事务结束l客户此时调用的会话构件方法就会代理到构件实例上客户此时调用的会话构件方法就会代理到构件实例上41构件运行环境构件运行环境 42/76高级软件工程高级软件工程l如果请求提交事务如果请求提交事务事务服务会在提交前将请求告知容器事务服务会在提交前将请求告知容器容器调用容器调用beforeCompletion 此时实例就应该将所有缓冲数据此时实例就应该将所有缓冲数据 写到数据库写到数据库如果请求卷回事务如果请求卷回事务不用容器调用不用容器调用beforeCompletion就会达到卷回状态就会达到卷回状态如果事务已经被标记为卷回如果事务已经被标记为卷回容器不能调用容器不能调用beforeCompletion(实例也不会将缓冲写入数据库实例也不会将缓冲写入数据库)42构件运行环境构件运行环境 43/76高级软件工程高级软件工程l事务完成后事务完成后 容器调用容器调用afterCompletion指定状态指定状态(提交或卷回提交或卷回)如果是卷回如果是卷回