当客户端回来时,有状态会话bean如何重新获得状态?

8
如果有状态的会话Bean将要被钝化,它的状态将被写入硬盘,然后Bean实例将被释放以服务其他请求(至少这是我的理解)。当同一客户端再次活跃时,Bean实例将从硬盘读取状态以恢复状态。但是Bean实例如何知道为哪个客户端读取哪个文件以维护状态?
我对J2EE非常陌生,所以如果我提出了一个非常幼稚的问题,请原谅我。如果我需要了解其他主题来理解这一点,请指点我方向。
1个回答

13
最好将有状态会话bean(SfSB)视为普通Java类的实例。您查找(或注入)一个SfSB实例,容器将为您创建一个实例并返回该实例。然后,您可以像处理任何其他Java实例一样使用该实例。这意味着您可以将该实例存储到会话中,将其序列化到磁盘上等。
详情是,您正在使用的实例实际上是指底层SfSB实例的代理。它不是实际的SfSB本身。
当您在本地代理上调用Bean时,容器的工作是将该Bean显现到内存中供您使用。Bean的挂起和激活在幕后自动完成(尽管您可以通过Bean的生命周期来了解该过程)。
容器需要的任何可用于查找被挂起SfSB的信息都存储在与您交互的代理中,但这对您是不透明的。您不必担心此问题。
因此,在典型的基于Web的方案中,生命周期将为您获取Bean实例,将其存储在Web会话中,然后简单地像正常情况下一样使用它。如果容器决定需要暂停您的Bean以腾出空间或其他原因,它将自动为您暂停它。当用户返回时,您的应用程序从Web会话中提取实例并进行调用。此时,如果Bean已挂起,则容器将自动为您激活该Bean。整个机制依赖于容器,但对您透明。您需要记住的重要事情是,必须像处理任何Java对象一样保留从容器获取的SfSB。
最后一个注意事项是,如果您允许SfSB挂起太长时间,容器将自动为您删除它。

感谢Will的解释。但是,如果在SfSB被删除后用户返回,这是否可能发生?如果可能的话,在这种情况下会发生什么? - Bhushan
2
是的,这完全有可能。如果发生这种情况,当您尝试访问SfSB时,将会收到一个异常(确切的异常我无法说)。 SfSB的超时时间是可配置的(通过EJB 3.1中的注释或通过EJB 3中的容器特定机制),因此目标是将超时持续时间与状态的预期寿命联系起来。话虽如此,我不会给它们无限的范围。 另外,SfSB很可能无法在应用程序重新部署后存活。服务器重启可以,但重新部署则不行。 - Will Hartung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接