是否有 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/