会话bean如何工作?

时间:2014-05-14 13:00:54

标签: java java-ee ejb rmi jndi

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

那么我将从app服务器获得什么bean?它会是同一个bean两次还是我将使用bean的第二个实例?如果我将两次获得相同的bean,我怎样才能从app服务器获得同一个bean的两个不同实例?我只是对豆子本身的看法感到困惑。如果可能提供一些资源。

2 个答案:

答案 0 :(得分:2)

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

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

  • 如果您的bean是无状态的,那么methodAmethodB 不会保证在服务器端的完全相同的bean实例上运行。
  • 如果您的bean是有状态的,那么methodAmethodB 保证在服务器端的完全相同的bean实例上运行。

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

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

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

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

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

答案 1 :(得分:1)

  

有状态会话bean是企业bean(EJB组件)   充当使用它的客户端的服务器端扩展。该   有状态会话bean由客户端创建,仅适用于   该客户端直到客户端连接被删除或bean为止   明确删除。

这意味着,对于同一客户端而言,无论您多次从服务器获取,都必须返回相同的实例。否则,你不能依赖国家。

另请参阅Oracle documentation