2014-09-25 76 views
2

使用有状态EJB时,如果客户端没有活动会话,服务器如何知道EJB与谁关联?我以前使用过无状态的EJB,但现在正在尝试学习如何使用有状态的EJB。我正在考虑将我的购物车作为一个有状态的EJB来实现,而不是将POJO Cart作为用户会话中的一个属性添加。但是由于有状态的EJB没有明确地作为HttpSession中的一个属性添加,所以服务器如何将客户端与有状态的EJB相关联?有状态EJB与会话属性

+0

服务器无法与客户端的会话,除非它已被添加(或使用了'@ Inject'和有状态会话bean是'@关联SessionScoped')。什么让你觉得它是? – 2014-09-26 03:31:06

+0

我认为,在有状态EJB的情况下,当我在有状态EJB中发出请求来运行一个方法时,同一个bean正在为一个客户端提供服务,所以我不确定bean和那个1客户端之间的连接是什么。 – user1154644 2014-09-26 20:16:02

+0

有状态会话bean在客户端执行查找时创建。从查找返回的代理包含某种特定的bean实例的引用/ ID,因此当客户端在代理上进行后续调用时,它将连接回特定的bean实例。 – 2014-09-26 23:05:47

回答

1

EJB在技术上并不需要需要才能访问客户端的JSESSION_ID,因为就像任何基本的POJO一样,只要呼叫客户端处于活动状态,它就是活的且可用的。一旦调用客户端被破坏或以其它方式放弃对SFSB的控制下,豆易于被钝化或破坏(并且因此“忘记”谈话)

the Oracle JavaEE-6 tutorial

的状态被保持为客户端/ bean会话的持续时间。如果 客户端删除该bean,则会话结束并且状态 消失。这种状态的短暂性不是问题, 然而,因为当客户端和bean 两端之间的对话,就没有必要保留状态

想起来了,你弄个同样的方式一个普通java对象的关系:一旦你将组合对象设置为null,你基本上已经结束了与该对象的对话。这里同样适用(有点)。客户端不需要将特定的会话信息传递给EJB。 EJB的正常生命周期和注释(特别是@Remove)会照顾其他所有内容。

有关SFSB的警告:它们是重量级的,它们比SLSB持续时间更长。除非您确实需要全面的EJB标记,否则不要使用它们。在很多情况下,一个普通的HttpSession和一个SLSB就足够了。

进一步阅读

+0

注意事项不一定是正确的。有些模式可以与SFSB一起使用,让您可以扩展应用程序以避免由SLSB引发的锅炉代码和贫血模型。除非您真的拥有*许多*用户,否则Oracle文档称不会过度使用SLSB – Sergio 2014-09-27 13:18:38