Java 有状态EJB与会话属性

Java 有状态EJB与会话属性,java,session,jakarta-ee,ejb,Java,Session,Jakarta Ee,Ejb,使用有状态EJB时,如果客户端没有活动会话,服务器如何知道EJB与谁关联?我以前使用过无状态EJB,但现在正在尝试学习如何使用有状态EJB。我正在考虑将我的购物车实现为一个有状态EJB,而不是将POJO购物车作为属性添加到用户会话中。但是,由于有状态EJB没有在HttpSession中显式添加为属性,服务器如何将客户机与有状态EJB关联?从技术上讲,EJB不需要访问客户机的JSESSION\u ID,因为与任何基本pojo一样,只要调用客户机处于活动状态,它就处于活动状态且可用。一旦调用客户机被

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

从技术上讲,EJB不需要访问客户机的JSESSION\u ID,因为与任何基本pojo一样,只要调用客户机处于活动状态,它就处于活动状态且可用。一旦调用客户机被销毁或以其他方式放弃对SFSB的控制,bean就可能被钝化或销毁(从而“忘记”会话)

该状态在客户端/bean会话期间保留。如果 客户机删除bean,会话结束,状态恢复 消失。这种状态的暂时性不是问题, 但是,因为当客户端和bean之间的对话 结束时,无需保留状态

与在has-a关系中获得常规java对象的方式相同:一旦将组合对象设置为null,就基本上结束了与该对象的对话。同样的情况也适用于这里(某种程度上)。客户端不需要向EJB传递特定的会话信息。EJB的正常生命周期和注释(特别是
@Remove
)负责处理其他一切

关于SFSB的一点警告:它们是重量级的,比SLSB耐用。不要使用它们,除非你真的需要一个全面的EJB的陷阱。在许多情况下,一个普通的HttpSession和一个SLSB就足够了

进一步阅读


服务器无法将客户端与会话关联,除非已添加会话(或者您正在使用
@Inject
,并且有状态会话bean是
@SessionScoped
)。给你的印象是什么?我想,对于有状态EJB,当我请求在stateleful EJB中运行一个方法时,同一个bean服务于一个客户机,所以我不确定bean和该1个客户机之间的连接是什么。有状态会话bean是在客户机执行查找时创建的。从查找返回的代理包含对特定bean实例的某种引用/ID,因此当客户端对代理进行后续调用时,它会连接回特定bean实例。注意事项不一定正确。有一些模式可以与SFSB一起使用,它允许您缩放应用程序,以避免SLSB引发的锅炉板代码和贫血模型。Oracle doc建议不要过度使用SLSB,除非您确实有很多用户