Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无状态会话bean的请求作用域上下文_Java_Ejb 3.0_Java Ee 5 - Fatal编程技术网

Java 无状态会话bean的请求作用域上下文

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*

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*
     *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的名称建议不要存储状态,因此没有请求范围的概念。有一个会话作用域限制在当前运行时会话上下文中,您不能同时存储状态,因此排除了在bean或容器中存储状态的任何选项

使用变量可能会带来一些运气,但顾名思义,它的作用域是当前的执行线程。根据您发布的代码,这似乎是您想要的。这种方法的问题是

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

有状态会话bean(在推送购物车的意义上)也不起作用。如果我使用@EJB注入机制,OtherBean实例不会获得与SessionFacaceBean实例相同的SFSB实例Statelessnes不是这里的问题。servlet也是无状态的。如果我的SLSF是一个WebService,我可以得到一个注入-这是一个卓越的请求范围。在我看来,规范中仍然存在漏洞。(我之前对EJBContext.getContextData有过评论,但这并不能满足您的需要。抱歉。)无状态的do store状态!会话状态,在方法调用期间有效@justin.hughey这是JavaEE5的吗?读这个问题,我说是吗?是否作为“答案”提供?虽然我没有给出额外的上下文,但这并不是一个答案。在非EE5环境下用谷歌搜索这个问题,你会发现这一点。这就是我帮助别人的意图。对不起,这是不能接受的。