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