2012-01-03 114 views
1

我有一个servlet代码,它调用一个有状态的会话bean代码并增加它的一个int值。但是,当我调用这个servlet并且它下一次是相应的bean时,这个bean就会失去它的状态,并且从开始递增开始。任何人都可以帮助我解决这个问题。我的代码如下:有状态会话Bean - Stateloss问题

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(); 
     } 
    } 

} 
+2

你可以显示Counter的定义吗?如果它确实是一个EJB,那么你不能用新的来创建它。否则,提到这个问题的EJB是没有意义的。 – 2012-01-03 11:40:16

回答

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对象。

0

它看起来像在你的servlet中,你没有试图记住哪个SFSB的第一个请求被服务。因此,下一次请求进入时,您将创建一个新的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。

0

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