@Stateful(name="stateful") @Local(Session.class) public class StatefulSessionBean implements Session { private int result; @Override public void add() { result++; } @Override public int get() { return result; } }
Then create a servlet to Dependency Inject the stateful session bean
public class StatefulDependencyInjectionServlet extends HttpServlet { @EJB(beanName="stateful") private Session stateful; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(true); Session bean = (Session)session.getAttribute("stateful"); if (bean == null){ bean = this.stateful; } bean.add(); System.out.println("Stateful: " + bean.get()); session.setAttribute("stateful", bean); } }
Test the servlet several times and check the result
[24/08/11 14:30:00:234 EST] 00000016 SystemOut O Stateful: 1
[24/08/11 14:30:03:234 EST] 00000016 SystemOut O Stateful: 2
[24/08/11 14:30:06:203 EST] 00000016 SystemOut O Stateful: 3
It seems working fine. But if we close the browser, open it again and test the servlet several times, we will see:
[24/08/11 14:33:15:812 EST] 00000016 SystemOut O Stateful: 4
[24/08/11 14:33:16:718 EST] 00000016 SystemOut O Stateful: 5
[24/08/11 14:33:17:328 EST] 00000016 SystemOut O Stateful: 6
This behaviour is incorrect as when the browser is closed and reopened, it represents a new client, who should get a new instance of stateful session bean.
Now create another servlet to access the stateful session bean through Context Lookup.
@EJB(name="ejb/stateful", beanInterface=Session.class, beanName="stateful") public class StatefulContextLookupServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(true); Session stateful = (Session)session.getAttribute("stateful"); if (stateful == null){ try{ Context ctx = new InitialContext(); stateful = (Session)ctx.lookup ("java:comp/env/ejb/stateful"); }catch (Exception e) { throw new EJBException(e); } } stateful.add(); System.out.println("Stateful: "+stateful.get()); session.setAttribute("stateful", stateful); } }
Test the servlet several times and check the result
[24/08/11 14:38:42:250 EST] 00000016 SystemOut O Stateful: 1
[24/08/11 14:38:45:453 EST] 00000016 SystemOut O Stateful: 2
[24/08/11 14:38:46:000 EST] 00000016 SystemOut O Stateful: 3
Close the browser, open it again and test the servlet several times
[24/08/11 14:39:38:734 EST] 00000016 SystemOut O Stateful: 1
[24/08/11 14:39:39:796 EST] 00000016 SystemOut O Stateful: 2
[24/08/11 14:39:40:546 EST] 00000016 SystemOut O Stateful: 3
Now the behaviour is correct.
No comments:
Post a Comment