使用有状态EJB时,如果客户端没有活动会话,服务器如何知道EJB与谁关联?我之前使用过无状态EJB,但现在我正在尝试学习如何使用有状态EJB。我正在考虑将我的购物车实现为有状态EJB,而不是在用户会话中添加作为属性的POJO购物车。但由于有状态EJB未在HttpSession中显式添加为属性,因此服务器如何将客户端与有状态EJB关联起来?
答案 0 :(得分:1)
EJB在技术上需要无法访问客户端的JSESSION_ID,因为就像任何基本的pojo一样,只要调用客户端,它就是活着的和可用的活着。一旦调用客户端被销毁或以其他方式放弃对SFSB的控制,该bean就有可能被钝化或销毁(因此"忘记"会话)
来自the Oracle JavaEE-6 tutorial
状态在客户端/ bean会话期间保留。如果 客户端删除bean,会话结束和状态 消失即可。这种状态的暂时性不是问题, 但是,因为客户端和bean之间的对话 结束,没有必要保留国家
想象一下你在has-a关系中掌握常规java对象的方式:一旦你将组合对象设置为null,你就基本上结束了与该对象的对话。这同样适用于此(有点)。客户端不需要将特定会话信息传递给EJB。 EJB的正常生命周期和注释(特别是@Remove
)会照顾其他所有内容。
关于SFSB的警告:它们是重量级的,并且比SLSB持续时间更长。除非你真的需要一个全面的EJB陷阱,否则不要使用它们。在许多情况下,普通的HttpSession和SLSB就足够了。
进一步阅读