Java 无状态会话bean的请求作用域上下文
EJB3会话bean是否有请求范围的上下文?我的环境是Java-EE-5 这个例子Java 无状态会话bean的请求作用域上下文,java,ejb-3.0,java-ee-5,Java,Ejb 3.0,Java Ee 5,EJB3会话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*
@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也不是一个选项)。是否有无状态会话bean的请求范围上下文 简而言之,答案是否定的 答案很长:您需要一些上下文来在业务方法调用之间共享数据。这可能是一个设计问题。Requestscope是web层的一个概念
- 在Web层中,请求、页面、会话和应用程序范围作为Hashmap实现。因此,您可以将对Hashmap的引用作为上下文传递,以共享所有数据
- 另一种方法是使用单例(需要在节点之间共享,例如使用ehcache)
- 迁移到EJB3.1并使用@Singleton
- 考虑使用有状态bean,并将您的请求范围放入bean会话范围,在您离开请求范围后,该会话范围可以被删除
一旦EJB方法完成执行,对象就不会被销毁;它们将返回到容器的线程池。因此,如果在不同的执行上下文中读取ThreadLocal值,您将找到使用相同线程的上一个执行上下文的值。换句话说,请确保应用程序在读取值之前始终将值放入ThreadLocal对象中李>Thread
- 此外,在不需要任何ThreadLocal对象时释放它们,否则会导致内存泄漏