jakarta-ee - 如何为 EJB 中的下一次调用保留无状态 bean 的实例变量的状态?

标签 jakarta-ee ejb state

我正在阅读 Java EE7 documentation这就是无状态 bean 的含义。我对下面以粗体标记的声明的含义感到困惑

无状态 session bean 不维护与客户端的 session 状态。当客户端调用无状态 bean 的方法时,bean 的实例变量可能包含特定于该客户端的状态,但仅在调用期间。当方法完成时,不应保留特定于客户端的状态。 但是,客户端可以更改池化无状态 bean 中实例变量的状态,并且该状态将保留到池化无状态 bean 的下一次调用。 除了在方法调用期间,无状态 bean 的所有实例都是等效的,允许 EJB 容器将实例分配给任何客户端。也就是说,无状态 session bean 的状态应该适用于所有客户端。

然而从这篇文章中,
instance variables in stateless session beans

无状态 session bean 是一个对象,它没有关联的 session 状态,但可能具有实例状态。它不允许并发访问 bean。实例变量的内容不能保证在方法调用中保留。客户端应将无状态 session bean 的所有实例视为相同。

我觉得这里有矛盾。文档声称(根据我的理解)实例变量状态在下一次调用中被保留,而后一篇文章声称不能保证状态被保留。

请解释

P.S:我确实读过这篇文章:但我没有掌握答案

instance variables in stateless session beans

编辑 形成上面的SO帖子

无状态 session Bean (SLSB) 不绑定(bind)到一个客户端,并且不能保证一个客户端在每次方法调用时都获得相同的实例(某些容器可能会在每个方法调用 session 中创建和销毁 bean,这是一个特定于实现的决定,但实例通常是池化的——我没有提到集群环境)。换句话说,尽管无状态 bean 可能有实例变量,但这些字段并不特定于一个客户端,因此在远程调用之间不要依赖它们。

最佳答案

  • SLSB 通常以多个形式创建并存储在池中。所以对于 EJB UserDataService ,将创建和汇集许多实例
  • 当客户请求 UserDataService 的服务时,容器将服务于池中的实例之一。任何人。当两个客户端请求同一个 EJB 的服务时,将有两个单独的实例服务
  • 当客户端使用 SLSB 完成后,正在使用的实例通常会返回到池中,而不是销毁 .这意味着在容器启动时创建的相同的唯一 EJB 对象可以完全想象在容器正常运行期间存在于堆上。值得重复:在容器首次将 EJB 投入服务时创建和池化的相同 SLSB 在容器的正常运行时间内保持事件状态
  • (3) 的意思是,如果 (2) 中的客户端在它从池中获取的 EJB 实例上设置任何变量并将 EJB 放回池中,则获取该实例的下一个客户端将能够查看对该 EJB 状态所做的更改(回想一下,池中有(某种)固定数量的 EJB 实例,它们在请求服务的各个客户端之间循环)。
  • 无法保证 UserDataService 的具体实例请求的客户端将获得 .不能保证 (2) 中的客户端将获得相同的 UserDataService 实例。针对该 EJB 的两个单独请求。这就是没有 session 状态的意思。 不能保证通过多次调用与该 EJB 的同一个实例进行对话 .这并不意味着 EJB 在请求中被销毁,只是在循环过程中,您无法确定您的客户端将与哪个实例相关
  • 关于jakarta-ee - 如何为 EJB 中的下一次调用保留无状态 bean 的实例变量的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26309050/

    相关文章:

    C#/面向对象的设计——维护有效的对象状态

    jakarta-ee - 带有 JBoss 7.1 的 SEAM2 应用程序 - ClassNotFoundException

    java - 在 Java EE 应用程序中显示错误消息时出现意外结果(字段为空时不会出现错误)

    java - 使用 Glassfish 的 EJB 客户端

    Hibernate 与 Entity Bean

    java - Android:如何忽略或禁用 savedInstanceState?

    javascript - NextJS 中的状态管理

    jakarta-ee - 将 jar 添加到 WEB-INF/lib 文件夹和 BuildPath 有什么区别

    java - 找不到 EntityManager Apache Deltaspike

    ejb - 如何将 EJB 注入(inject) SOAPHandler?