如何在“会话”中为所有bean提供状态?

我有以下设计。 当客户端向服务器发出请求时,服务器会创建一个包含各种信息的状态。 有各种无状态和有状态的bean需要读写这个状态。 请参阅此非专业图表:

在此处输入图像描述

ComputationCycle类是处理开始并按阶段工作的地方。 在每个阶段,它调用其他Manager类(其行为类似于实用程序类)来帮助计算(图表仅显示1个阶段)。 正在从CC类和管理者那里读取和写入状态,两者都是无状态的。

State拥有有状态的EmployeeDepartmentCar类(在一些不相关的数据结构中)。 这些类也可以调用Manager类。 这是由一个简单的@Inject Manager1 。 CC使用经理的方式相同。

我的问题是如何从无状态类(以及CarDepartmentEmployee类)访问有状态(及其包含的类),尽管我认为解决一个将解决另一个问题。 我无法将有状态bean注入无状态bean。 因此,在客户端发出请求并开始计算周期后,如何访问与此请求相关的状态?

一种解决方案是将状态传递给无状态类中的每个方法,但这实际上非常麻烦和臃肿,因为所有方法都会在任何地方都有一个“愚蠢”的状态论证。

我怎样才能使这个设计按照我想要的方式工作?

我无法将有状态bean注入无状态bean。

您绝对可以通过这种方式注入依赖项。

如果有状态bean是@RequestScoped,那么对该线程上的无状态bean的任何调用都会触及CDI注入的上下文引用(低代理),它将找到有状态bean的正确实例。

只要你使用CDI,你就不需要在自己的threadlocals中藏匿东西而烦恼。

买家要小心,ThreadLocal可能会做你想要的,以及静态访问器。 但是,如果您不是非常小心地在请求结束时删除每个条目,则此类很容易导致内存泄漏。 另外,您似乎正在使用EJB; 我假设他们都在同一个JRE中。 我在相似的情况下使用ThreadLocal,我没有遇到任何问题。 当上下文关闭时,我使用SerletContextListener来清空对ThreadLocal的静态引用,尽管这在一些较旧的Web应用程序服务器上存在问题,所以我确保ThreadLocal在尝试使用之前存在。

EJB可以跨服务器相互“交谈”。 听起来本地所有EJB都在相同的上下文中运行。

创建一个包含您的状态的类。

扩展ThreadLocal – 您可以匿名执行此操作 – 并覆盖initialValue()以返回类的新实例。

创建一个实用程序类以将ThreadLocal保存为静态字段。 不要使它成为最终创建静态获取并删除调用ThreadLocal.get()和remove()的方法。 创建一个在上下文关闭时调用的静态destroy()方法 – 请参阅ServletContextListener。