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

Jakarta ee 如何为EJB中的下一次调用保留无状态bean实例变量的状态?,jakarta-ee,ejb,state,Jakarta Ee,Ejb,State,我正在阅读,下面是关于无状态bean的内容。我不明白下面黑体字的说法是什么意思 无状态会话bean不与客户机保持对话状态。当客户机调用无状态bean的方法时,bean的实例变量可能包含特定于该客户机的状态,但仅在调用期间。方法完成后,不应保留特定于客户端的状态但是,客户端可以更改池中无状态bean中实例变量的状态,该状态将保留到池中无状态bean的下一次调用。除了在方法调用期间,无状态bean的所有实例都是等效的,允许EJB容器将实例分配给任何客户端。也就是说,无状态会话bean的状态应该应用于

我正在阅读,下面是关于无状态bean的内容。我不明白下面黑体字的说法是什么意思

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

但是从这个帖子上,,

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

我觉得这里有矛盾。文档声明(据我所知)实例变量状态在下一次调用中被保留,而后一次调用声明不保证状态被保留

请解释一下

附言:我确实读过这篇文章,但我没有掌握答案

编辑上面的SO帖子

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

  • SLSB通常是以倍数创建的,并存储在一个池中。因此,对于EJB
    UserDataService
    ,将创建许多实例并将其存储在池中

  • 当一个客户端请求
    UserDataService
    的服务时,容器将为一个池实例提供服务。任何一个。当两个客户端请求相同EJB的服务时,将有两个单独的实例提供服务

  • 当客户机使用SLSB时,正在使用的实例通常会返回到池中,而不是销毁。这意味着在容器启动时创建的相同唯一EJB对象可以在容器正常运行期间一直存在于堆中。这需要重复:sa在容器首次将EJB投入服务时创建和汇集的me SLSB在容器的正常运行期间保持活动状态

  • (3)的意思是,如果(2)中的客户机在从池中获取的EJB实例上设置了任何变量,并且该EJB被放回池中,那么获取该实例的下一个客户机将能够看到对该EJB的状态所做的更改(回想一下,有一个池中EJB实例的固定数量,它们在请求服务的各种客户端之间循环)

  • 无法保证请求客户端将获得
    UserDataService
    的特定实例。无法保证(2)中的客户端将在对该EJB的两个单独请求上获得相同的
    UserDataService
    。这就是所谓的无对话状态。您不能保证通过多次调用与该EJB的同一实例进行对话。。这并不意味着EJB在请求期间被销毁,只是在调用过程中循环,您无法确定您的客户将与哪个实例相关


  • 是的。它试图说您可以使用实例状态(适用于所有客户机),但不能使用会话状态(适用于一个客户机)。任何客户机都可以从bean池中获取任何实例(例如,一个客户机调用一个方法两次,可能会转到两个不同的实例)@ElliottFrisch:根据这篇文章,不同的客户端可能会在无状态bean中看到不同的实例状态。但是文档声称,状态会保留到下一次调用。不同的客户端可能会连接到集群中的不同节点,您到底想了解什么?状态会在调用期间保留。如果您有实例变量,然后对其进行修改,则修改将在以后的每次客户端调用中持续进行,除非;如果重新启动应用程序服务器,则会恢复。如果重新部署应用程序,则会恢复。如果希望不同的客户端看到不同的实例变量,则不会恢复。@brainstorm我同意,这些语句很混乱g、 我认为区别可能与客户端状态和组件状态有关。客户端状态不会在调用之间保留,而组件状态(bean专用的状态)可以并且可以被客户端修改。我想这篇文章的首要答案可能会给你一些启示:好吧,重点是对一个实例的状态所做的更改会保留到同一个实例的下一次调用中。但是更改不会反映在池中的所有实例上。因此,不能保证你会看到相同的INSTANCE下次调用正确时?代理在这里起作用吗?@brainstorm-准确地说。在任何DI容器(JavaEE/Spring/Guice)中,代理无处不在。然而,EJB的代理机制不同于