2011-11-19 89 views
7

如果有状态会话bean将被钝化,它的状态被写入硬盘,然后bean实例将被释放以服务于其他请求(至少这是我的理解)。当同一个客户端再次激活时,bean实例将从硬盘读取状态以重新获得状态。但是,bean实例如何知道哪个客户端需要读取哪个文件才能维护状态?当客户端回来时,有状态会话bean如何恢复状态?

我对J2EE很新,所以请原谅我,如果我要求一个非常天真的怀疑。如果我需要了解其他任何主题以了解这一点,请指出正确的方向。

回答

13

最好将状态会话Bean(SfSB)可视化为非常接近普通Java类的实例。您查找(或注入)SfSB的实例,容器将为您创建一个并返回实例。然后,您会像处理任何其他Java实例一样处理该实例。

这意味着,你可以在实例存储会话,它序列化到磁盘等

的细节是,你正在使用的实例实际上是代理实际的,潜在的SFSB实例。这不是真正的SfSB本身。

当您在本地代理上对该bean进行调用时,它是容器作业将该bean展示给您的内存。 bean的钝化和激活是在幕后完成的(尽管您可以通过bean生命周期访问该过程)。

容器需要找到钝化的SfSB的任何信息都存储在您正在使用的代理中,但这对您来说是不透明的。你不必担心。

因此,在一个典型的基于Web的场景中,生命周期就是让你的bean实例存储在Web会话中,然后像普通一样简单地使用它。如果容器决定它需要钝化你的bean来腾出空间或任何东西,它会自动为你钝化它。当您的用户返回时,您的应用程序将从Web会话中提取实例并进行调用。那时候,如果bean被钝化,容器会自动激活你的bean。整个机制取决于容器,对您而言是透明的。你要记住的重要一点是你必须坚持从容器中获得的SfSB,就像你对任何Java对象一样。

最后需要注意的是,如果您允许SfSB被钝化太久,容器会自动为您删除它。

+0

谢谢你的解释。但是在SfSB被删除之后用户是否有可能返回?如果可能的话,那种情况下会发生什么? – Bhushan

+2

是的,这是完全有可能的。如果发生这种情况,当您尝试访问SfSB时会发生异常(确切的例外情况,我不能说)。 SfSB的超时是可配置的(通过EJB 3.1中的注释或通过EJB 3中的容器特定机制),所以目标是将超时持续时间与状态的预期使用期限相关联。也就是说,我不会无限制地给他们。此外,SfSB很可能无法在重新部署申请之后继续存在。重新启动服务器,是的,但不能重新部署。 –