如果有状态会话 bean 将要钝化,它的状态将被写入硬盘,然后 bean 实例将被释放以服务其他请求(至少这是我的理解)。当同一个客户端再次处于活动状态时,bean 实例将从硬盘读取状态以重新获得状态。但是 bean 实例如何知道它必须为哪个客户端读取哪个文件来维护状态呢?
我对 J2EE 很陌生,所以如果我提出一个非常幼稚的疑问,请原谅我。如果我需要知道任何其他主题来理解这一点,请指出正确的方向。
如果有状态会话 bean 将要钝化,它的状态将被写入硬盘,然后 bean 实例将被释放以服务其他请求(至少这是我的理解)。当同一个客户端再次处于活动状态时,bean 实例将从硬盘读取状态以重新获得状态。但是 bean 实例如何知道它必须为哪个客户端读取哪个文件来维护状态呢?
我对 J2EE 很陌生,所以如果我提出一个非常幼稚的疑问,请原谅我。如果我需要知道任何其他主题来理解这一点,请指出正确的方向。
最好将 Stateful Session Bean (SfSB) 可视化为非常接近普通 Java 类的实例。您查找(或注入)一个 SfSB 的实例,容器将为您创建一个并返回该实例。然后,您可以像使用任何其他 Java 实例一样使用该实例。
这意味着您可以将实例存储到 Session 中,将其序列化到磁盘等。
细节是您正在使用的实例实际上是实际的底层 SfSB 实例的代理。这不是实际的 SfSB 本身。
当您在本地代理上调用 bean 时,容器的工作就是为您将该 bean 显示到内存中。bean 的钝化和激活是在幕后为您完成的(尽管您可以通过 bean 生命周期进入该过程)。
容器查找钝化 SfSB 所需的任何信息都存储在您正在使用的代理中,但这对您来说是不透明的。你不必担心。
因此,在典型的基于 Web 的场景中,生命周期将是您获取 bean 实例,将其存储在 Web 会话中,然后像平常一样简单地使用它。如果容器决定它需要钝化你的 bean 以腾出空间或其他什么,它会自动为你钝化它。当您的用户返回时,您的应用程序会从 Web 会话中提取实例并进行调用。那时,如果 bean 被钝化,容器会自动为你激活 bean。这整个机制依赖于容器,但对您来说是透明的。您要记住的重要一点是,您必须像使用任何 java 对象一样,使用从容器中获取的 SfSB。
最后需要注意的是,如果您允许 SfSB 钝化时间过长,容器将自动为您删除它。