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

Bhu*_*han 7 java ejb java-ee stateful-session-bean

如果有状态会话bean要钝化,则将其状态写入硬盘,然后释放bean实例以提供其他请求(至少这是我的理解).当同一个客户端再次处于活动状态时,bean实例将从硬盘读取状态以重新获得状态.但是bean实例如何知道哪个客户端必须读取哪个文件来维护状态呢?

我是J2EE的新手,所以如果我问一个非常天真的怀疑,请原谅我.如果我需要了解任何其他主题来理解这一点,请指出我正确的方向.

Wil*_*ung 13

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

这意味着您可以将实例存储到会话中,将其序列化为磁盘等.

细节是您正在使用的实例实际上是实际的底层SfSB实例的代理.这不是真正的SfSB本身.

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

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

因此,在典型的基于Web的场景中,生命周期是您获取bean实例,将其存储在Web会话中,然后像平常一样简单地使用它.如果容器决定它需要钝化你的bean以腾出空间或其他什么,它会自动为你钝化它.当您的用户返回时,您的应用程序会从Web会话中提取实例并进行调用.那时,如果bean被钝化,容器将再次自动为你激活bean.整个机制取决于容器,但对您来说是透明的.重要的是要记住,你必须坚持从容器中获取的SfSB,就像你对任何java对象一样.

最后需要注意的是,如果您允许SfSB钝化太长时间,容器会自动为您删除它.

  • 是的,这绝对是可能的.如果它发生,当你试图访问SfSB时会得到一个例外(确切的例外,我不能说).SfSB的超时是可配置的(通过EJB 3.1中的注释,或通过EJB 3中的容器特定机制),因此目标是将超时持续时间与状态的预期寿命相关联.也就是说,我不会无限期地给予他们.此外,SfSB很可能无法在重新部署应用程序时继续存在.重启服务器,是的,但不是重新部署. (2认同)