JavaEE 7中的EJB

从EJB3.0开始,Entity Bean只是JPA概念下的普通POJO,只剩下2种类型的EJB:

  • Session Bean
  • Message-Driven Bean,监听某类消息的监听器,以异步处理消息(此处略)

1.  Session Bean的类型

Session Bean包含一定的业务逻辑,供客户端调用执行特定的任务,部分Session Bean可以实现为Web Services。Session Bean的状态是由其实例变量的值表示的。

Session Bean的类型:

  • stateful

有状态的Session Bean是临时的,客户端调用有状态的Session Bean开始执行一定的任务;客户端关闭,则被其调用的有状态的Session Bean也会关闭。有状态的Session Bean只能供一个客户端调用,不能在客户端之间共享,不能实现为Web Service。

客户端创建引用指向有状态的Session Bean时,EJB容器初始化(Initiate)一个有状态的Session Bean的实例,有状态的Session Bean的方法进入就绪(Ready)状态,随时供客户端调用。有状态的Session Bean就绪一段时间后如果没有客户端被调用,EJB容器根据LRU算法选择有状态的Session Bean并使之钝化(Passive)。处于钝化状态的有状态的Session Bean,如果被客户端调用,则EJB容器会激活(Active)并使之进入再次就绪状态。最后,客户端调用@Remove标注的方法将使得有状态的Session Bean实例被注销。

  • stateless

无状态的Session Bean不会维护与客户端的会话状态。客户端调用前后,无状态的SessionBean的状态是一样的。

缓冲池中的无状态的Session Bean都是一样的,EJB容器可以用任意一个无状态的Session Bean响应任意客户端的调用。无状态的SessionBean可以在客户端之间共享,可以实现为Web Service。

EJB容器初始化会创建并维护一定数量的无状态的Session Bean实例,并将其置于缓冲池中。处于缓冲池中的无状态的Session Bean实例可供任何客户端随时调用。EJB容器注销时会注销缓冲池中的无状态的Session Bean实例。

  • singleton

单例的Session Bean只在应用范围内实例化一次,并在整个应用的生命周期有效。

在功能上,单例的Session Bean类似于无状态的Session Bean,也可以实现为Web Service。但是在实例的数量上,单例的Session Bean只有一个,而无状态的Session Bean可以有多个。

通常,单例的Session Bean在应用启动或停止的时候执行一些特定的任务。而在应用运行期间,在客户端的调用过程中,单例的Session Bean将保持状态不变。

单例的Session Bean的生命周期与无状态的Session Bean类似。

 

2. 访问EJB的接口

EJB可以提供如下两种访问方式:

  • no-interface view

未实现任何业务接口的EJB类,直接暴露EJB实现类的public方法给客户端

只能供本地应用访问的local方法

  • business interface

这是EJB类实现的标准接口

一个业务接口,默认为local访问,除非使用@Remote, @Local之一明确标注。

不过,一个业务接口不能同时使用@Remote,@Local标注。

 

3.客户端对EJB的访问

客户端对本地EJB的访问方法:

  • 依赖注入@javax.ejb.EJB
  • JNDI lookup

客户端对远程EJB的访问方法:

  • 依赖注入@javax.ejb.EJB
  • JNDI lookup

 Web Service客户端除了可以访问JAX-WS或JAX-RS服务之外,还可以访问无状态Session Bean。

 

4.Session Bean的异步方法

在Session Bean的同步方法调用中,直至Session Bean中的方法执行完毕,客户端才会重新获控制权。

而在SessionBean的异步方法调用中,EJB容器会立刻将控制权和一个java.util.concurrent.Future<V>实例返回给客户端,然后EJB容器再调用Session Bean的业务方法。客户端通过java.util.concurrent.Future<V>实例可以随时查看异步方法的状态和结果。

Session Bean的异步方法使用@javax.ejb.Asynchronous标注定义,返回值可以是void类型(无法处理方法执行的异常)也可以是java.util.concurrent.Future<V>接口的实现(可以处理方法执行的异常)。

Session Bean的异步方法返回的结果不会直接对客户端可见,而是先交给EJB容器,EJB容器响应客户端的查询和监控,对客户端可见。


你可能感兴趣的:(java,bean,服务器,ejb,ejb,3.0,ee)