有状态会话Bean - Stateloss问题

时间:2012-01-03 07:50:14

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

我有一个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();
       }
   }

}

3 个答案:

答案 0 :(得分:4)

在您的代码中,每次请求进入时都会创建新的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对象。

答案 1 :(得分:0)

在您的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。

答案 2 :(得分:0)

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