《基于EJB分布式业务应用组件规范说明.doc》由会员分享,可在线阅读,更多相关《基于EJB分布式业务应用组件规范说明.doc(13页珍藏版)》请在三一办公上搜索。
1、基于EJB分布式业务应用组件规范说明大连诚高科技股份有限公司第一章 前言1. 目的2. 适用范围EJB组件开发人员,EJB组件维护人员,组件使用人员3. 参考文档4. 术语说明5. 文档变更说明第二章 平台架构简介1、各引擎功能说明服务引擎:查询应用的服务化,将查询引擎转化为实际业务应用,同时也可以提供查询应用 的公共服务接口。查询引擎:使用EJB封装对查询业务的操作,实现对查询业务管理的组件化,引擎的应用,采用本地jar包+EJB本地(远程调用)的形式日志引擎:使用EJB封装对日志记录的操作,实现对日志管理的组件化,采用EJB拦截器机制,记录内容包括,用户信息、操作内容等,并可回溯操作结果(
2、包括第三方应用)。搜索引擎:使用IBM Omnifind API 实现搜索引擎的功能.安全认证:包括EJB自定义安全域、用户KEY验证等多种安全认证。 权限管理:对用户信息和权限进行统一管理,提供安全认证接口。将用户的部门、角色、权限统一划分分配,同时通过对用户信息的管理,可以拓展业务需求,如短信通知、邮件通知、绩效考核、签到等增值服务和人员管理的服务2、关于EJB技术所有的EJB实例都运行在EJB容器中。容器提供了系统级的服务,控制了EJB的生命周期。因为容器掌握了绝大多数系统级的事件。EJB的开发者只需要考虑应用逻辑。通常来说,EJB容器提供了以下的一些系统服务。1、安全管理:控制了客户能
3、够访问的不同的应用函数。容器通过只允许授权的客户访问这些函数来达到这个效果。2、远程调用; 容器为远程链接管理着低层的通信,而且对EJB的开发者和客户都隐藏了底层的通信过程。EJB的开发者在编写应用方法的时候,就像是在调用本地的平台一样。客户也不清楚他们调用的方法可能是在远程被处理的。3、对象管理:客户简单的创建一个EJB的实例,并通常取消一个实例。而容器管理着EJB的实例,使EJB实现最大的效能和内存利用率。容器能够激活和钝化EJB对象,保持众多客户共享的实例池。等等。4、事务管理: 控制了EJB的事务处理的需求。容器管理着复杂的事务处淫。这些事务这些事务可能在不同的平台之间更新数据库。容器
4、使这些事务之间相互独立,互不干扰。保证所有的更新数据库都是成功发生的,否则,就回滚到事务处理之前的状态。5、持久管理:提供实体对象到关系数据库的映射,包括基于对象查找的查询语言在关系数据库上的实现,对象之间的关系在数据库的表中的体现等。6、集群服务:为容器提供集群服务,使多个物理上分离的容器能够提供同样的服务,同时保持服务的一致性。让用户感觉在同一个容器上执行操作。3、各个组件的开发(实现)的总体流程3.1 会话bean(接口)远程接口:根据需求建立业务方法本地接口:继承远程接口所有方法,根据需求添加本地方法l 如果会话 bean 没有定义EJB3.0 业务接口, 则不允许调用getBusin
5、essObject 方法。l 如果会话 bean 没有定义EJB3.0 业务接口或不是通过业务接口调用会话bean,则不允许调用getInvokeBusinessInterface 方法。l 如果会话 bean 没有定义远程客户端视图,则不允许调用getEJBObject和getEJBHome 方法。l 如果客户端没有定义本地客户端视图,则不允许调用getEJBLocalObject和getEJBLocalHome 方法。l 对于没有有意义的事务上下文的会话 bean 方法和所有bean 管理事务分割的会话bean,不允许调用getRollbackOnly 和setRollbackOnly。l
6、 由容器通过会话 bean 的web 服务终端调用的会话bean 方法中不允许调用getMessageContext 方法。getMessageContext 方法返回实现了JAX-RPC web 服务终端的无状态会话bean 的javax.xml.rpc.handler.MessageContext接口。l 对于没有有意义事务上下文和/或客户端安全上下文的会话bean 方法,不允许调用资源管理器、企业bean 和EntityManager。l 使用容器管理事务分割的企业 bean 不能获取UserTransaction 接口。会话 bean 类的名称必须遵循这些规则:l 方法名可以是任意的,
7、但不能以“ejb”开头以避免与EJB 架构使用的回调方法冲突。l 业务方法必须声明为 public。l 方法不能声明为 final 获static。l 如果方法对应于会话 bean 远程业务接口或远程接口的业务方法,那么它的参数和返回类型必须是RMI/IIOP 的合法类型。l 如果方法是 web 服务方法或对应于会话bean 的web 服务终端接口的方法,那么它的参数和返回类型必须是JAX-WS/JAX-RPC 的合法类型。l throws 子句可以定义任意的应用异常。下面是对会话 bean 业务接口的要求:l 接口不能继承 javax.ejb.EJBObject 或javax.ejb.EJB
8、LocalObject 接口。l 如果业务接口是远程业务接口,则参数和返回类型必须是RME/IIOP 的有效类型。远程业务接口不要求或不希望是java.rmi.Remote 接口。Throws 子句不应当包含java.rmi.RemoteException。如果接口继承了java.rmi.Remote , 则业务接口的方法只可以抛出java.rmi.RemoteException。l 接口可以有父接口。l 如果接口是一个远程业务接口,那么它的方法不能暴露本地接口类型、计时器或计时器句柄、或用于实体bean 的受管理集合类来作为参数或返回值。l Bean 类必须实现业务接口,或者业务接口必须使用
9、Local 或Remote 注释符或部署文件被指定接口为bean 的本地或远程业务接口。应用以下规则:u 如果 bean 类只实现了一个接口,则这个接口被认为是bean 的业务接口。这个业务接口将是本地接口,除非它被用Remote 注释符或部署文件指派为远程业务接口。u Bean 类可以有多个接口。如果bean 类有多个接口,bean 类的任何业务接口必须显式地使用Local 或Remote 注释符或部署文件被指派。u 当 bean 类有多个接口时, 这些接口不包括下列的接口:java.io.Serializable;java.io.Externalizable;javax.ejb 包内的任何
10、借口。u 同一个业务接口不能既是本地接口又是远程接口(注:如果Local和/或Remote 注释符既被指定bean 类上又被指定到引用的接口上,则它们的值必须相同)。u bean 类通常都实现它的业务接口,如果bean 类使用注释符或部署文件来指派业务接口,那么不要求指明bean 类为接口的实现。下面是对会话 bean 远程接口的要求:l 接口必须继承 javax.ejb.EJBObject 接口。l 在接口内定义的方法必须遵循 RME/IIOP 的规则。这意味着它们的参数和返回值必须是RMI/IIOP 的有效类型,且它们的throws 子句必须包含java.rmi.RemoteExcepti
11、on。l 对于定义在远程接口内的每个方法,必须在会话 bean 类中有一个对应的方法。这个对应的方法必须有:u 相同的名字。u 相同的参数数量和类型,和相同的返回值。u 定义在会话 bean 类中对应方法的throws 中的所有异常,也必须在远程接口中的方法的throws 子句中定义。l 远程接口不能暴露本地接口类型、本地 home 接口类型、计时器或计时器句柄、或由容器管理持久化的实体bean 使用的受管理集合类作为参数或返回值。下面是对会话 bean 本地接口的要求:l 接口必须继承 javax.ejb.EJBLocalObject 接口。l 在本地接口中的方法的 throws 语句不能包
12、含java.rmi.RemoteException。l 本地接口可以有父接口。l 对于定义在本接口内的每个方法,必须在会话 bean 类中有一个对应的l 方法。这个对应的方法必须有:u 相同的名字。u 相同的参数数量和类型,和相同的返回值。u 定义在会话 bean 类中对应方法的throws 中的所有异常,也必须在本地接口中的方法的throws 子句中定义。3.2 会话bean实现类在会话bean实现类中,加入拦截器和自定义安全域(安全认证)远程接口实现:实现远程接口中的方法。本地接口实现:实现本地接口中的方法。3.3 拦截器(日志)定义在外部类的拦截器执行的优先级比定义在Bean类中的拦截器
13、要高。主要功能:封装应用的公用行为,使这些行为与业务逻辑分离;调用日志组件,对会话bean的使用进行日志记录。对一个单一业务方法的调用,InvocationContext 对象的上下文数据可以穿越多个拦截器方法调用。拦截器类必须有一个 public 的无参构造器。对企业 bean 的组件的编程限制同样适用于拦截器缺省拦截器,缺省拦截器应用于ejb-jar包内的所有组件上。部署文件用于定义缺省拦截器及他们的顺序。在bean的拦截器被调用之前调用缺省拦截器。方法级的拦截器,业务方法上可以定义业务方法拦截器方法。 拦截器方法可以定义在会话 bean 的业务方法和消息bean 的消息监听器方法上。业务
14、方法拦截器通过AroundInvoke 或around-invoke 配置元素指定。AroundInvoke 方法可以定义bean 的超类或拦截器类上。但是,在这些类上只能有一个AroundInvoke 方法。AroundInvoke 方法不能是bean 的业务方法(即不能是bean 的业务接口内定义的方法)。AroundInvoke 方法可以是public,private,protected,或包层级的方法。AroundInvoke 方法不可以声明为final 或static。AroundInvoke 方法有下面的标志符:Object (InvocationContext) throws E
15、xceptionAroundInvoke 方法可以调用任何业务无法方法可以调用的组件或资源。业务方法拦截器方法可以只应用到单个的业务方法上,而不是 bean 的所有方法上拦截器规范:配置interceptor用于指定拦截器类的方法。拦截方法用around-invoke,pre-contsturct,pre-destory,pre-passivate,post-activate元素来指定。拦截器类最多能有一个around-invoke,pre-contsturct,pre-destory,per=passivate,post-activate方法。如果为 bean 定义了多个拦截器方法,则使用下
16、面的规则来管理拦截器方法的调用顺序。部署文件可以覆盖在注释符内定义的拦截器顺序l 如果可能,首先调用缺省的拦截器方法。缺省的拦截器只能在部署文件中指定。按照在部署文件中指定的顺序执行缺省拦截器。l 如果在 bean 的类上指定了拦截器类,则在执行bean 本身的拦截器方法之前执行拦截器类上的拦截器方法。l 按照在 Interceptors 注释符中的顺序执行在拦截器类内定义的AroundInvoke 方法。l 如果拦截器类有超类,则先执行它父类的拦截器方法。l 在执行完拦截器类上拦截器方法后,那么按下述顺序执行:u 如果业务方法上定义有方法级的拦截器类,那么按照在业务方法上Intercepto
17、rs 注释符指定的顺序执行拦截器类上的AroundInvoke 方法。u 如果 bean 有超类,那么执行超类上的AroundInvoke 方法。u 执行 bean 类本身的AroundInvoke 方法。l 如果 AroundInvoke 方法被另一个方法重载(不过这个方法是否是自己的AroundInvoke 方法),则不会被调用。部署文件可以用于覆盖在注释符内指定的拦截器调用顺序。InvocationContext 对象提供了可以使拦截器方法控制拦截器链的元数据,包括是否调用下一个链中的拦截器方法以及它的参数和返回的值。3.4 安全认证(自定义安全域)EJB自定义安全域进行组件使用权限和安
18、全的验证,需要到指定的表中进行验证。3.5 实体bean对数据库中的表映射,生成数据客户化实体(1)实体Bean使用Entity注释来标记,所有实体bean中的属性如果不需要持久就用Transient注释来标记。实体bean的持久化字段可以通过JavaBeanstyle机制或者声明为public/protected字段来实现。(2)实体Bean中的关系可以通过ManyToMany、OneToMany、OneToOne等标记说明二者是多对多、一对多还是多对多的关联关系,这些标记直接使用在Bean文件中,以减少部署描述符的使用。(3)实体Bean和数据库的字段映射可以通过Column进行说明,这个
19、标记所起的作用是把Bean中的属性和数据库的字段一一对应起来。(4)多对多映射采取中间表连接的映射策略,建立的中间表将分别引入两边的主键作为外键。EJB3.0对于中间表的元数据提供了可配置的方式,可以自定义中间表的表名、列名。3.6 EJB QL(数据持久层)组件实现业务的核心,实现对数据库的操作第三章 业务流程与规范1查询组件 1.1 接口根据业务定义对数据库的查询方法,要能够通用的覆盖未来扩展功能的方法下面介绍一下用来执行EJB QL的Query接口的主要方法在QueryImpl中的实现,Public List getResultList()方法查询数据库并返回查询结果集合,首先如果Flu
20、shMode的类型是AUTO,那么就要用Session对象的flush方法提交与当前Session相关的数据。然后调用Query实例的list方法返回查询结果的列表。Public Object getSingleResult()方法查询数据库并只返回一条数据记录,首先如果FlushMode的类型是AUTO,那么就要用Session对象的flush方法提交与当前Session相关的数据。然后调用Query实例的uniqueResult方法返回一条查询结果。Public Query setParameter(String name,Object value)方法通过调用Query实例的setPar
21、ameter设置查询的参数。SetFirstResult 和 setMaxResults 方法实现数据分页功能。Public int executeUpdate()方法执行批量更新。 1.2 拦截器调用日志组件,对查询操作进行日志添加。缺省拦截器方法名(或配置文件):参数:使用者信息,操作内容,操作时间,操作ip等返回值:纪录成功、记录失败、其他方法级拦截器:方法名:参数:使用者信息,操作内容,操作时间,操作ip等返回值:纪录成功、记录失败、其他 1.3 自定义安全域对组件自定义的用户权限校验 1.4 实体bean参照第二章3.5 1.5 数据持久层 对数据库查询的具体方法2日志组件2.1 接
22、口日志记录增删改查Public List getResultList()方法查询数据库并返回查询结果集合,首先如果FlushMode的类型是AUTO,那么就要用Session对象的flush方法提交与当前Session相关的数据。然后调用Query实例的list方法返回查询结果的列表。Public Object getSingleResult()方法查询数据库并只返回一条数据记录,首先如果FlushMode的类型是AUTO,那么就要用Session对象的flush方法提交与当前Session相关的数据。然后调用Query实例的uniqueResult方法返回一条查询结果。Public Quer
23、y setParameter(String name,Object value)方法通过调用Query实例的setParameter设置查询的参数。SetFirstResult 和 setMaxResults 方法实现数据分页功能。Public int executeUpdate()方法执行批量更新。Public int executeDel()方法执行批量删除。 2.2 拦截器调用日志组件,对查询操作进行日志添加。缺省拦截器方法名(或配置文件):参数:使用者信息,操作内容,操作时间,操作ip等返回值:纪录成功、记录失败、其他方法级拦截器:方法名:参数:使用者信息,操作内容,操作时间,操作ip
24、等返回值:纪录成功、记录失败、其他 2.3 自定义安全域2.4 实体bean 2.5 数据持久层3安全组件3.1 接口 3.2 拦截器调用日志组件,对查询操作进行日志添加。缺省拦截器方法名(或配置文件):参数:使用者信息,操作内容,操作时间,操作ip等返回值:纪录成功、记录失败、其他方法级拦截器:方法名:参数:使用者信息,操作内容,操作时间,操作ip等返回值:纪录成功、记录失败、其他 3.3 自定义安全域3.4 实体bean 3.5 数据持久层4服务组件4.1 接口 4.2 拦截器调用日志组件,对查询操作进行日志添加。缺省拦截器方法名(或配置文件):参数:使用者信息,操作内容,操作时间,操作i
25、p等返回值:纪录成功、记录失败、其他方法级拦截器:方法名:参数:使用者信息,操作内容,操作时间,操作ip等返回值:纪录成功、记录失败、其他 4.3 自定义安全域第四章 组件调用1.本地调用依赖注入:会话 bean 可以使用依赖注入机制来获取对资源或环境中其他对象的引用。如果会话bean 使用依赖注入,那么容器在实例被创建后在实例方法被调用前注入这些引用。如果声明依赖SessionContext,或如果bean 类实现了可选的SessionBean 接口,SessionContext也会同时被注入。如果依赖注入失败,那么bean 实例被丢弃。2.远程调用Ejb-jar 文件必须通过包括或通过引用
26、包含每个企业bean 的下述类文件:l 企业 bean 类l 企业 bean 的业务接口,web 服务的终端接口,以及home 和组件接口。l 拦截器类l 如果 bean 是实体类,则还有主键类。Ejb-jar 文件也必须通过包括或引用包含所有的企业bean 类和home 接口,组件接口和/或依赖的web 服务终端,但不用包含Java EE 和J2SE 类。这些类包括超类和超接口,依赖的类,和用作方法参数、结果和异常的类和接口。应用组装人员不必将 EJBHome 和EJBObject 的stub 打包进ejb-jar 文件。这包括那些企业bean 的实现由ejb-jar 提供的企业bean 的stub,以及被引用的企业bean 的stub。生成stub 是容器的责任。Stub 通常由容器提供者的部署工具为每个继承了EJBHome 或EJBObject 接口生成stub,或者可以在运行时由容器生成。客户端也需要使用系统值类( 例如,实现了 javax.ejb.Handle 、javax.ejb.HomeHandle 、javax.ejb.EJBMetaData 、java.util.Enumeration 、java.util.Collection 和java.util.Iterator 接口的可序列化的值类)远程调用示例: