java - session Bean 是如何工作的?

标签 java jakarta-ee ejb rmi jndi

假设我的应用程序中部署了一个有状态 session Bean。在我的客户端应用程序中,我尝试在 JNDI 的帮助下使用此 session bean。在获得 bean 的 stub (不是实际的 bean 本身)并初始化该 bean 的某些字段后,我尝试使用 JNDI 再次获取该 bean。

那么我将从应用程序服务器获得什么bean?它会是同一个 bean 两次还是我会使用该 bean 的第二个实例?如果我将获得同一个 bean 两次,如何从应用程序服务器获得同一个 bean 的两个不同实例?我只是很困惑 bean 本身是什么。如果可能的话提供一些资源。

最佳答案

假设您通过 JNDI 获取对远程 bean 实例的引用。现在,假设您在远程 bean 上调用两个业务方法:methodAmethodB

有状态 bean 和无状态 bean 之间的(主要)区别是:

  • 如果您的 Bean 是无状态的,则 methodAmethodB 不能保证在服务器端完全相同的 Bean 实例上运行.
  • 如果您的 Bean 是有状态的,则 methodAmethodB 保证在服务器端完全相同的 Bean 实例上运行。

从客户端来看,请注意,您所拥有的只是对服务器端一个模糊对象的引用。在该“ stub ”上调用多个方法(即使它是同一个 stub 对象)并不能保证您将在服务器端处理完全相同的对象,除非您的 bean 是有状态的。

现在,更具体地说,回答你的问题。您说您在服务器上部署了一个 Stateful bean,并且您通过 JNDI 获得了对 bean 实例的引用。为此,您必须在 EJB 的 home 接口(interface)上使用 create 方法。 create 方法向您返回一个 stub ,该 stub 映射到服务器端的一个实例。

下次您在主界面上调用create时,您将获得一个不同 stub ,指向服务器端不同 bean .

如果您想保持对前一个 bean 的访问,那么您需要以某种方式保留对该远程对象的引用。

  • 如果您使用的是 EJB 2.x,那么您不应该在任何地方“缓存” stub ;相反,获取对 bean 句柄的引用并将句柄存储在某处。
  • 如果您使用的是 EJB 3.x,那么您只需存储对 stub 的引用即可。

关于java - session Bean 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23655515/

相关文章:

java - Track.getSimilar : An invalid XML character (Unicode: 0x3) was found in the element…

java - @EJB注解

java - AtomicInteger 和比较操作

java - 如何使用 GET 请求在 tomcat 中保留 utf-8 字符编码

java - 动态更改服务器而无需重新启动服务器

java - 在 Eclipse 中设置 EJB 构建类路径

java - IOException 编码(marshal) EJB 参数

jakarta-ee - EJB 3.1 |通过 JNDI 调用远程 session bean 时出错

java - 我创建的 equals() 和 hashcode() 没有做任何事情

java - 使用 java 库访问谷歌云存储获取 '403 forbidden'