【问题标题】:Stateful Session Bean - Stateloss Issue有状态会话 Bean - 状态丢失问题
【发布时间】:2012-02-01 07:38:19
【问题描述】:

我有一个 servlet 代码,它调用有状态会话 bean 代码并增加它的 int 值。但是,当我下一次调用 servlet 和它对应的 bean 时,bean 失去了它的状态,并再次从递增的开始开始。谁能帮我解决这个问题。我的代码如下:

public class CounterServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       response.setContentType("text/html;charset=UTF-8");
       PrintWriter out = response.getWriter();

       try {
           Counter counter = new Counter() ;
           HttpSession clientSession = request.getSession(true);
           clientSession.setAttribute("myStatefulBean", counter);

           counter.increment() ;

           // go to a jsp page

       } catch (Exception e) {
           out.close();
       }
   }

}

【问题讨论】:

  • 你能给出Counter的定义吗?如果它真的是一个 EJB,你就不能用 new 来创建它。否则,在这个问题上提到 EJB 是没有意义的。

标签: jakarta-ee servlets ejb ejb-3.0 stateful-session-bean


【解决方案1】:

这不是 EJB 问题。您正在创建 POJO 而不是 EJB。每次调用新函数都会启动一个新对象。这不是 Bean 注入。

【讨论】:

    【解决方案2】:

    在您的代码中,您每次收到请求时都会创建新的Counter,然后将新的Counter 保存到客户端的会话中。因此,您的计数器总是从头开始递增。

    在给他一个新的之前,您应该检查客户是否已经拥有Counter。应该是这样的:

    HttpSession clientSession = request.getSession();
    Counter counter = (Counter) clientSession.getAttribute("counter");
    
    if (counter == null) {
        counter = new Counter();
        clientSession.setAttribute("counter", counter);
    }
    
    counter.increment();
    

    此外,在本主题的名称中,您提到了Stateful session bean。但是,注入新 Counter 的方式看起来不像是在注入有状态 bean。在我看来,它就像一个普通的 Java 对象。

    【讨论】:

      【解决方案3】:

      看起来在您的 servlet 中您并没有试图记住第一个请求是使用哪个 SFSB 提供服务的。所以下次有请求进来时,你创建一个新的 SFSB,它没有状态。

      基本上你需要做的是(伪代码)

      Session x = httpRequest.getSession
      if (!mapOfSfsb.contains(x) {
         Sfsb s = new Sfsb();
         mapOfSfsb.put(x,s);
      }
      
      Sfsb s = mapOfSfsb.get(x);
      
      s.invokeMethods();
      

      即:获取http请求,查看是否附加了会话。如果是这样,请检查是否已经存在此会话的 SFSB 并使用它。否则,创建一个新的 SFSB 并将其粘贴到会话中。

      您还需要添加一些代码来清除不再使用的旧 SFSB。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        • 2013-08-02
        相关资源
        最近更新 更多