首页 > 代码库 > 图解EJB工作流程

图解EJB工作流程

学习EJB需要对JNDI和RMI方面知识有一定的了解。

JNDI为EJB提供命名和目录服务,实现不同目录位置的Bean的唯一标识。

RMI为EJB提供远程访问能力,实现Bean的远程调用功能

在介绍Bean的工作流程之前,先熟悉一下RMI的工作流程

RMI设计的目标:实现运行在不同JVM中Java对象的调用

  1. 客户端通过JNDI服务获取Bean对象的接口,称为桩(stub)
  2. 一般情况下Bean对象并不希望被直接操控,比如针对不同客户端暴露不同接口,所以在JVM2上也提供一个对外接口,称为骨架(skeleton),RMI底层代码实现桩和骨架之间的Socket通信。
  3. 骨架针对桩的调用,执行Bean中相应的方法
  4. Bean对象将执行结构返回给骨架
  5. 骨架将执行结构通过RMI的Socket通信,将执行结构返回到JVM1中
  6. JVM1中的桩接收返回结果传递给客户端。

EJB 中SessionBean工作流程

    

  1. 客户端通过JNDI服务查找Home对象
  2. EJB容器返回Home对象的桩
  3. 客户端通过Home对象的create()方法获取服务组件的引用
  4. 服务介入
  5. 服务为Bean创建EJBObject骨架对象,服务创建SessionBean对象(有状态的SessionBean对象针对每个客户端单独创建一个对象;无状态的SessionBean在部署成功后会自动创建一个SessionBean对象的池,针对不同客户端,可能会调用同一个SessionBean
  6. 返回EJBObject桩
  7. 客户端通过EJBObject桩调用SessionBean方法
  8. RMI实现桩和固件之间的通信
  9. EJBObject将调用方法请求传递给服务
  10. 服务调用SessionBean中的方法
  11. SessionBean执行方法,返回结果
  12. 服务将执行结果转发给EJBObject
  13. EJBObject通过RMI将执行结果返回给EJBObject桩
  14. 桩将执行结果返回给客户端
  15. 备注服务是什么?由于SessionBean和EJBObject并没有直接的继承关系,无法像RMI那样直接调用SessionBean的方法,所以需要额外提供调用的实现,有服务器提供商提供具体解决方案。PS:这个"服务"就是Struts的前身。如果你有Struts的基础,也不难理解这个概念。

EJB中实体Bean的工作流程和会话Bean类似,不做详述。

  1. 实体Bean代表数据库底层的记录,每个Bean对应一条记录
  2. 如果不同客户端访问同一条记录,即同一个Bean时,访问同一个EJBObject对象,同时服务调用同一个EntityBean

SessionBean和EntityBean流程的区别

       会话Bean会针对不同客户端请求,创建相应的EJBObject;实体Bean针对每一条记录创建不同的EJBObject;---》》因此会话Bean针对不同客户端请求,EJBObject不同;实体Bean针对不同客户端请求,如果请求的是同一个实体,则访问同一个Bean

EJB中MessageDrivenBean的工作流程

  1. 客户端发送一条消息到JMS队列中
  2. 消息驱动Bean实际上是消息的消费者(JMS的Client),服务检查到消息队列中有消息
  3. 服务到Bean池中查找队列相应的消息驱动Bean
  4. 获取到消息驱动Bean后,处理相应消息。


图解EJB工作流程