2012-01-03 3 views
1

나는 stateful 세션 빈 코드를 호출하고 그것의 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를 생성 할 수 없습니다. 그렇지 않으면,이 질문에 대한 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 빈을 주입하는 것처럼 보이지 않습니다. 나에게 일반적인 자바 객체처럼 보인다.

0

서블릿에서 첫 번째 요청이 처리 된 SFSB를 기억하지 못하는 것처럼 보입니다. 따라서 다음에 요청이 들어 오면 상태가없는 새 SFSB를 만듭니다. HTTP 요청을 얻고 세션이 연결되어있는 경우, 참조 :

은 기본적으로 무엇을 당신이해야 할 것은 (의사 코드)입니다

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

Sfsb s = mapOfSfsb.get(x); 

s.invokeMethods(); 

입니다. 그렇다면이 세션에 대한 SFSB가 이미 있는지 확인하고 사용하십시오. 그렇지 않으면 새 SFSB를 만들어 세션에 고정시킵니다.

더 이상 사용되지 않는 오래된 SFSB를 지우려면 몇 가지 코드를 추가해야합니다.

0

이것은 EJB 문제가 아닙니다. EJB가 아닌 POJO가 생성됩니다. 새 함수를 호출하면 매번 새로운 객체가 시작됩니다. 그것은 콩 주입이 아닙니다.