EJB 类型

2025年03月17日 | 阅读 9 分钟

EJB企业JavaBeans的缩写。它是一个服务器端软件元素。它封装了应用程序的业务逻辑。它是用于在Java平台上开发分布式业务应用程序的规范。有三种类型的EJB: 会话Bean实体Bean消息驱动Bean。在本节中,我们将详细讨论所有类型的EJB

Types of EJB

让我们逐一详细讨论。

会话 Bean

该bean萌芽业务理念可以被客户、远程和Web服务系统地使用。当客户端想要使用在服务器上分布的应用程序时,客户端使用会话bean方法。此会话bean为客户提供服务,通过在服务器中执行业务操作来保护他们免受复杂问题的困扰。

为了访问被传达给工作人员的应用程序,客户端调用会议bean的策略。 会议bean为其客户端执行工作,通过在工作人员内部执行业务任务来保护它免受复杂性。 请记住,会话bean不是持久性的。

会话Bean有两种类型

  • 无状态会话Bean
  • 有状态会话Bean
  • 单例会话Bean

无状态会话Bean

无状态会话bean不与客户或客户端保持会话状态。当客户端调用无状态bean的方法时,bean的实例变量可能包含专门针对该客户端的状态,但仅限于调用的时间范围。

当该方法完成后,不应保留客户端的特定状态。但是,客户端可能会更改在池化无状态bean中呈现的实例变量的状态,并且此状态将保留到池化无状态bean的下一次调用。

Types of EJB

除此之外,在方法调用期间,无状态bean的所有实例都是相同的,允许EJB容器将一个实例分配给任何客户端。因此,无状态会话bean的状态应适用于所有客户端。它可以在Web服务中实现。

由于它们可以维护多个客户,无状态会话bean可以为需要大量客户的应用程序提供更好的适应性。通常,应用程序需要的无状态会话bean比有状态会话bean少,以支持相同数量的客户。

为了提高执行效率,如果它具有以下任何特征,我们可以选择一个无状态会话bean。

  • bean的状态对特定客户端没有信息或数据。
  • 在私有方法调用中,bean为所有客户端执行通用任务。
  • bean实现一个Web服务。

有状态会话Bean

有状态会话bean与交互式会话相同。 对象的状​​态由其实例变量的值组成。在有状态会话bean中,实例变量表示独特的客户端/bean会话的状态。由于客户端与bean交互。状态通常被称为会话状态。它在多个请求中保持客户端的状态。因此,我们无法在Web服务中实现它,因为它无法共享。当客户端终止会话时,它将不再与客户端关联。

该状态在客户端/bean会话的时间范围内被保留。如果客户端删除了bean,则会话关闭并且该状态被省略。状态的这种瞬态本质不是一个问题,因为客户端和bean之间的交互结束。因此,不需要保持状态。

Types of EJB

如果以下任何条件有效,则应使用有状态会话bean

  • bean的状态表示bean和特定客户端之间的联盟。
  • bean需要在方法调用中保留有关客户的数据。
  • bean在客户和应用程序的不同部分之间干预,为客户引入了改进的可见性。
  • 在后台,bean处理几个企业bean的工作流程。

注意:无状态和有状态的会话bean都不是持久性的。

单例会话Bean

单例会话bean为每个应用程序维护一个实例,该实例存在于应用程序的生命周期中。它提供与无状态会话bean相同的功能。但唯一的区别是每个应用程序只有一个单例会话bean,而在无状态会话bean中,使用bean池。

从该池中,任何会话bean都可以响应客户端。我们可以在Web服务端点中实现它。它负责状态,但如果发生意外崩溃或关闭,它不会保持状态。如果我们要关闭应用程序或关闭时执行清理任务,也可以使用它。这是因为它在整个应用程序生命周期中运行。

Types of EJB

单例会话bean适用于以下条件

  • bean的状态必须在整个应用程序中共享。
  • 多个线程应同时访问单个企业bean。
  • 应用程序需要在应用程序启动和关闭时执行任务。
  • bean实现一个Web服务。

实体 Bean

实体bean是一个不可预测的业务实体。它模拟了业务实体或模拟了业务交互中的不同活动。它用于促进包括数据和对该数据进行计算的业务福利。它可以处理几个依赖的、勤奋的对象,以发挥其基本任务。实体bean是一个管理稳定信息并执行复杂业务逻辑的远程对象。它可以被一个基本密钥明确区分。

Types of EJB

它是一个管理稳定信息,执行复杂业务逻辑,可能利用几个病房Java对象,并且可以由一个基本密钥明确区分的远程对象。它通常是粗粒度的确定对象,因为它们使用存储在几个细粒度的无情Java对象中的稳定信息。元素bean是勤奋的,因为它们在工作人员崩溃或组织的失败中确实可以幸存。

Types of EJB

每个实体bean都有与其关联的持久标识。这意味着它包含一个唯一的标识,如果我们有一个主键就可以获取。唯一密钥的类型由bean提供者定义。如果主键丢失,客户端可以检索实体bean。如果bean不可用,则EJB容器首先实例化bean,然后重新填充客户端的数据。

Types of EJB

实体bean信息的勤奋性被赋予了在bean被动化时保存状态并在检测到故障转移时改进状态。它可以忍受,因为该信息由容器以某种形式的数据存储系统(例如数据库)确定地放置。

实体bean通过使用以下两种方法来保留业务数据

  • Bean 托管持久性 (BMP)
  • 容器管理的持久性 (CMP)

Bean 托管持久性

与容器管理的持久性相比,bean托管持久性更复杂。因为它允许我们将持久性逻辑明确地写入bean类中。为了将持久性处理代码写入bean类中,我们必须知道正在使用的数据库的类型以及bean类的字段如何映射到数据库。因此,它在数据库和bean实例之间提供了更大的灵活性。

如果部署工具与将bean实例的状态映射到数据库不兼容,则可以使用它来替代CMP。BMP的缺点是需要做更多的工作来定义bean,并且它将bean绑定到特定的数据库类型和结构。

容器管理的持久性

容器管理的持久性中,EJB容器透明且隐式地处理bean和数据库之间的关系。 Bean开发人员专注于数据和业务流程。 主要的约束是EJB隔间很可能无法产生信息库访问语句,其效率与程序员一样。

与BMP不同,CMP不允许我们在实体bean类的方法中编写数据库访问调用。 这是因为持久性由容器在运行时处理。 需要以下两件事来支持CMP

  • 映射:它表示如何将实体bean映射到资源。
  • 运行时环境:一个 CMP 运行时环境,它使用映射信息对每个bean执行持久化操作。
Types of EJB

注意:实体bean已被Java持久性API取代。

消息驱动Bean (MDB)

MDBJava消息服务(消息侦听器)。它使用来自队列或主题订阅的消息。它提供了一种使用JMS消息侦听器创建或实现异步通信的简便方法。使用MDB的优点是它允许我们使用JMS侦听器的异步特性。我们可以使用Oracle JMS(Java消息服务)实现消息驱动Bean。

有一个EJB容器(包含MDB池)处理JMS队列和主题。每个传入的消息都由一个由容器调用的bean处理。请注意,没有对象直接调用MDB。MDB的所有调用都来自容器。当容器调用MDB时,它可以调用其他EJB或Java对象以继续请求。

Types of EJB

它与无状态会话bean非常相似。因为它不保存非正式状态,也用于处理多个传入请求。与JMS相比,EJB具有以下优势

  • 它为侦听器创建一个使用者。这意味着容器创建QueueReceiverTopicSubscriber由容器创建。
  • MDB已向使用者注册。这意味着,在部署时,容器注册了QueueReceiver、TopicSubscriber及其工厂。
  • 指定消息 ACK 模式。

MDB的主要功能是从JMS目标(即队列或主题)读取(接收)或写入(发送)传入。 使用MDB时,请确保它已正确配置和安装。 它与JMS和安装在Oracle数据库上的JMS交互。 数据库保留队列或主题。 下图描述了MDB与JMS目标交互的方式。

Types of EJB

MDB的工作方式如下

  • MDB通过使用数据源(JMS资源提供程序)创建一个JMS连接并打开数据库。 JDBC驱动程序用于促进JMS连接。
  • MDB在JMS连接上打开一个JMS会话。
  • 如果MDB的任何消息被路由到MDB的onMessage()方法,则来自队列或主题。 其他客户端也可以访问同一队列和主题,以将消息放入MDB中。

请注意,它不处理客户端请求的请求,而是处理放入队列中的请求。

MDB实现了javax.ejb.MessageDriverBean接口并继承了javax.jms.MessageListener类,该类提供了以下方法

方法描述
onMessage(msg)容器从与此 MDB 关联的 JMS 队列中取出一条消息,并通过调用此方法将其提供给此实例。此方法必须实现用于适当地处理消息。
setMessageDrivenContext(ctx)创建 bean 后,将调用 setMessageDrivenContext 方法。此方法类似于 EJB 的 setSessionContext 和 setEntityContext 方法。
ejbCreate()此方法与无状态会话 bean 的 ejbCreate 方法一样使用。不应在此方法中进行任何初始化。但是,您在此方法中分配的任何资源都将存在于此对象中。
ejbRemove()删除在 ejbCreate 方法中分配的任何资源。

Session Bean 和 Entity Bean 的区别

下表描述了会话 bean 和实体 bean 之间的主要区别。

比较基础会话 Bean实体 Bean
主键它没有主键。它用于标识和检索特定的 bean 实例。它有一个主键,允许我们找到实例,并且可以由多个客户端共享。
无状态/有状态它可以是有状态的或无状态的。它是有状态的。
生命周期它的生命周期相对较短。它的生命周期相对较长。
性能它代表与客户端的单一对话。它封装了持久化业务数据。
可访问性它由单个客户端创建和使用。它可以被多个客户端共享。
恢复如果 EJB 服务器发生故障,它无法恢复。因此,它可能会被销毁。如果发生任何故障,它可以恢复。
数据持久性它仅在与客户端的对话期间持久化数据。在客户端实例的生命周期之外的持久性。持久性可以是容器管理的或 bean 管理的。
远程接口它扩展了 javax.ejb.EJBObject。它扩展了 javax.ejb.EJBObject。
Home 接口它扩展了 javax.ejb.EJBHome。它扩展了 javax.ejb.EJBHome。
Bean 类它扩展了 javax.ejb.EJBSessionBean。它扩展了 javax.ejb.EJBEntityBean。

下一主题EJB 容器