一、什么是EJB?
§EJB 组件是为企业级应用设计的java 组件模型,是基于标准分布式对象技术
§EJB 组件提供了应用的商务逻辑部分。由于它们不涉及表示层的问题,因此必须与其它的显示技术(如servlets),服务于HTML 客户端的JSP技术,或者使用了诸如AWT、Swing 技术的java 应用一起使用。
§实现了EJB 规范的应用服务器提供了可以解决安全性、资源共享、持续运行、并行处理、事务完整性等复杂问题的服务,从而简化了商业应用系统
§EJB 技术将开发人员和底层中间件相隔离; 开发人员看到的仅仅是Java 平台。将使得EJB 服务器厂商在不干扰用户的EJB应用程序的前提下,有机会改进中间件层
§EJB 服务器完成“繁杂”的工作:
应用开发人员关注于业务逻辑的实现,而不是底层的实现机制,从而提高开发效率。
二、Session Bean
§一般用于实现应用程序的控制、处理和工作流,在MVC中,会话Bean处理Control。代表单个客户端来执行,当EJB容器失效后就不存在。
§短暂存在:会话Bean 通常用来提供服务,表示与客户机之间的一个会话,它们不代表长期存在的事物
§Session Bean以分为有状态SessionBean和无状态SessionBean
§示例:计算器、购物车、命令处理器
三、无状态会话Bean?有状态会话Bean?
Stateless
在不同方法调用间不保留任何状态
事务处理必须在一个方法中结束
通常资源占用较少;可以被共享(因为它是无状态的)
Statefull
可以在不同的方法调用间保持针对各个客户端的状态
与客户端的联系必需被维持;通常开销较大
四、Entity Bean
实体Bean表示持久数据的对象视图,如数据库中的一个数据行。实体Bean有一个就像数据库中的主键一样,唯一地标识一个实体Bean
实体Bean有两种类型:BMP,CMP
实体Bean的示例:
描述一个定单号
包含客户的个人信息
五、 会话Bean?实体Bean?
会话bean
表示一个业务过程
每一客户一个实例
Short-lived:与客户生命同步
暂态的
服务器崩溃后丢失
可以是事务性的
实体bean
表示业务数据
在多个客户间共享实例
Long-lived:与数据库中数据同步
持久的
服务器崩溃后可重构
总是事务性的
六、MessageDriven Bean
实体Bean和会话Bean均采用同步编程模式,而MDB引进了一种异步处理方式
MDB是JMS和EJB集成的结果,不同于其他EJB,客户机不需要直接调用消息Bean,相反,客户机只需发一个消息给JMS目的。在消息到达JMS目的之后,MDB的onMessage()将被调用,以处理这个消息
MDB通常用于在服务器中执行异步操作
七、Weblogic EJB特性
Stateful session beans和entity beans支持caching
对CMP entity bean增加了很多提高性能的特性,如提供批量操作功能
对CMP entity bean,Weblogic Server提供了多种增值的数据库访问特性,如自动产生主Automatic primary key generation
Automatic table creation
可以将EJB部署到cluster上,支持EJB的负载均衡和容错
……
SessionBean
有状态会话Bean可以在客户访问之间保存数据,而无状态会话Bean 不会在客户访问之间保存数据。两者都实现了javax.ejb.SessionBean 接口,EJB 容器区通过部署文件ejb-jar.xml 来判断是否为一个SessionBean 提供保存状态的服务
八、EntityBean的基本原理
EJB规范把EntityBean定义为一种持久性的、事务性的以及可以共享的组件,以便多个客户机可以同时使用其中的业务数据。而且EntityBean能够提供持久存储支持,直到被删除为止
EntityBean表示持久数据的对象视图,EntityBean中的字段相应于底层持久存储中的数据。
EntityBean的状态是事务性的,当客户机更新事务中的字段时,仅当事务提交后,这个更新才是持久的。
EntityBean的持久类型
作为持久对象,实体Bean的状态必须保存在数据库中,实体Bean有两种操作类型:容器管理持久性和Bean管理持久性
在Bean管理持久性的情况下,Bean需要提供代码,从数据库中加载实体bean和把实体bean写到数据闸中,通常,这需要在bean类中增加JDBC代码,读取或更新实体bean的字段,或把实体bean的字段写入数据库中
在容器管理持久性的情况下,EJB容器自动地提供把实体Bean写入数据库中的代码,不需要增加JDBC代码
九、MessageDrivenBean
消息驱动Bean是EJB和JMS的集成产品,消息驱动Bean也存在于EJB容器中,而且也可以利用EJB容器提供的服务,但是消息驱动Bean并不直接和客房机进行交互,它只是一个JMS消息的监听器
消息驱动Bean作为JMS队列和主题的监听器部署,而且响应新到JMS消息执行它们的业务逻辑
客户端不需要直接调用消息Bean,客户机只需发一个消息给JMS目的,在消息到达JMS目的之后,消息Bean的onMessage()将被调用,以处理这个消息
客户通过将JMS信息传送到Bean监听的队列或主题间接地调用Bean的方法
十、MDB的生命周期
MDB的生命周期类似于无状态的会话Bean
可以在ejb-jar.xml中为Bean指定一个JMS Queue或Topic,EJB容器将把MDB注册为一个消息监听器,当消息到达JMS目的时,EJB容器将寻找或创建一个MDB实例。
同无状态会话Bean一样,MDB也可以采用实例池的方式
十一、MDB的部署描述文件
ejb-jar.xml:包含MDB的名字,事务类型和JMS目的
weblogic-ejb-jar.xml
在<destination-jnid-name>中定义JMS目的
因为MDB不直接与客户机进行交互,因此不需要定义<jndi-name>
默认时,MDB使用标准的JMS连接工厂,也可以利用<connection-factory-jndi-name>指定一个连接工厂
十二、消息Bean与并发控制
EJB容器将负责MDB的并发控制,MDB不是多线程程序,EJB容器不会采用重入的方式调用MDB实例,与无状态会话Bean一样,EJB容器也把MDB实例放到内存的实例池中
Weblogic-ejb-jar.xml中的<initial-beans-in-freepool>和<max-beans-in-freepool>可以控制实例池的容量
MDB的并发控制方式使EJB容器可以尽可能多地并行处理消息,EJB容器是以并发线程的方式处理消息的,因此消息的处理有可能打乱顺序。开发人员不应当假定MDB是按顺序传递消息的
十三、MDB与事务
MDB提供了三个不同的事务选项
Required:
如果指定了Required事务属性,EJB容器可以自动地开始一个事务,之后,从JMS队列或主题中接收消息的过程将包含在事务中
可以确保JMS消息的接收过程和onMessage()调用均参与JTA事务,当OnMessage()调用返回时,EJB容器将提交事务,如果事务中止执行,JMS消息将继续保持在JMS目的中,并且可以再次传递给某个MDB
NotSupported
如果指定了NotSupported事务属性,在调用MDB的onMessage()之前,EJB容器不会开始事务。当消息的接收过程无法参与事务,且JMS的消息确认机制能够提供有效的保证时,可以使用它
十四、Bean管理的事务
利用Bean管理事务,在Bean中可以使用EJBContext.getUserTransaction(),得到对UserTransaction对象的引用
消息的接收过程不参与事务,如果UserTransaction中止,消息无法自动地重新传递
应当使用一个单独的JMS目的专门处理应用级的错误,以确保不会继续重新传递不适当的消息
十五、消息的确认
在MDB中,EJB容器自动地处理JMS消息的确认
当MDB使用Required事务属性时,EJB容器在事务提交时对消息进行确认
当MDB使用NotSuppoerted事务属性或Bean管理的事务时,EJB容器将采用AUTO_ACKNOWLEDGE确认方式
可以在ejb-jar.xml中使用<jms-acknowledge-mode>指定消息确认的方式
十六、MDB与JMS
利用EJB容器的部署描述文件,MDB可以自动地支持并发的消息处理,JMS应用也可以通过扩展ServerSessionPool来达到这个目的,但增加了开发人员的工作量
MDB是把异步接收的过程加到JTA事务中的唯一
MDB简单且基于标准