【问题标题】:Stateful EJB vs. Session Attribute有状态 EJB 与会话属性
【发布时间】:2014-11-20 17:16:27
【问题描述】:

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

【问题讨论】:

  • 服务器无法将客户端与会话关联,除非它已被添加(或者您正在使用 @Inject 并且有状态会话 bean 是 @SessionScoped)。是什么给你的印象?
  • 我认为对于有状态 EJB,当我请求在有状态 EJB 中运行方法时,同一个 bean 正在为单个客户端提供服务,所以我不确定bean 和那 1 个客户。
  • 有状态会话 bean 在客户端执行查找时创建。从查找返回的代理包含对特定 bean 实例的某种引用/ID,因此当客户端对代理进行后续调用时,它会连接回特定的 bean 实例。

标签: java session jakarta-ee ejb


【解决方案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 就足够了。

进一步阅读

【讨论】:

  • 谨慎不一定正确。有一些模式可以与 SFSB 一起使用,让您可以扩展应用程序以避免由 SLSB 引发的样板代码和贫血模型。 Oracle 文档说不要过度使用 SLSB,除非你真的有 很多 个用户
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 2015-03-12
  • 2019-01-24
  • 2012-04-04
  • 2013-04-30
  • 1970-01-01
  • 2012-12-28
相关资源
最近更新 更多