java - 为无状态 session bean 请求范围上下文

标签 java ejb-3.0 java-ee-5

是否有 EJB3 session bean 的请求范围上下文?我的环境是 Java-EE-5。

这个例子

@Remote(SessionFacade.class) @Stateless
public class SessionFacadeBean implements SessionFacade {
  @EJB
  private Other bean;

  public void myBusinessMethod() {
     // TODO: get or create *myRequestScope*
     *myRequestScope*.put("demo", Integer.valueOf( 1 ));
     bean.otherBusinessMethod();
     sysout(*myRequestScope*.get("demo"));
  }
}

@Local(Other.class) @Stateless
public class OtherBean implements Other {
  public void otherBusinessMethod() {
     // TODO: get or create *myRequestScope*
     *myRequestScope*.put("demo", Integer.valueOf( 2 ));
  }
}

调用 SessionFacadeBean#myBusinessMethod() 时应始终打印输出“2”——无论并行调用如何。

我没有使用 CDI 的奢侈。而且,它还应该独立于事务传播工作(因此 JCA 也不是一个选项)。

最佳答案

Stateless EJB,顾名思义就是不存储状态,所以没有request-scope的概念。有一个 session 范围仅限于当前运行时 session 上下文,您也不能在其中存储状态,因此排除了在 bean 或容器内存储状态的任何选项。

您可能会通过使用 ThreadLocal 找到一些运气变量,但顾名思义,它的作用域是当前执行线程。按照您发布的代码,这似乎是您想要的。这种方法的问题在于,

  • Thread 一旦 EJB 方法执行完毕,对象就不会被销毁;它们返回到容器的线程池。因此,如果您在不同的执行上下文中读取 ThreadLocal 值,您将找到先前使用同一线程的执行上下文的值。换句话说,确保您的应用程序始终在读取值之前将值放入 ThreadLocal 对象中。
  • 此外,一旦您不需要任何 ThreadLocal 对象,请释放它们,否则您手上会发生内存泄漏。

关于java - 为无状态 session bean 请求范围上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6242025/

相关文章:

java - 第三次出现时用 null 替换子字符串

java - 语句 executeBatch 方法返回值为 2 的数组

java - EJB3 : Why are transaction semantics and statefulness considered implementation details?

java - 方法 ejbCreate 的 EJB 3.0 版本是什么

java - EJB3 和手动层次结构持久性

java - 在哪里放置括号以简洁地将转换对象转换为原始类型而不自动拆箱?

java - 无法构建 android 项目,因为 ActionBarActivity 无法解析为类型

java - 为什么我的 EJB 接口(interface)需要扩展可序列化?

java - 两个相关 JPA 实体之间的接口(interface)

java - Maven 存储库 Artifact : jboss-j2ee