2012-01-03 5 views
1

У меня есть код сервлета, который вызывает код состояния сеанса с состоянием и увеличивает его значение int. Но, когда я вызываю сервлет и его соответствующий компонент в следующий раз, бит теряет его состояние и снова начинается с начала приращения. Может ли кто-нибудь помочь мне решить эту проблему. Мой код ниже:Stateful Session Bean - Stateloss Issue

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

Можете ли вы показать определение счетчика? Если это действительно EJB, вы не можете создать его с новым. В противном случае упоминание EJB для этого вопроса не имеет смысла. –

ответ

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, не похож на то, что вы вводите компонент Stateful. Для меня это выглядит как обычный Java-объект.

0

Похоже сервлет вы не пытаетесь вспомнить, 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. Вызов новой функции каждый раз инициирует новый объект. Это не Бин-инъекция.

Смежные вопросы