Session maintenance with j2ee generated stub
balteo May 22, 2006 8:05 PMHello,
I am trying to maintain state between a JSE endpoint and a servlet that acts as a client.
Here is the code for the client:
/* * addClient.java * * Created on May 22, 2006, 8:44 PM */ package pack; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; import javax.xml.rpc.Stub; /** * * @author julien * @version */ public class AddClient extends HttpServlet { /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. * @param request servlet request * @param response servlet response */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { // This code block invokes the add operation on web service int sum = getAdderWebServiceSEIPort().add(4); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet addClient</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Servlet addClient at " + sum + "</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } catch(java.rmi.RemoteException ex) { // TODO handle remote exception } catch(Exception ex) { // TODO handle custom exceptions here } } // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> /** Handles the HTTP <code>GET</code> method. * @param request servlet request * @param response servlet response */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** Returns a short description of the servlet. */ public String getServletInfo() { return "Short description"; } // </editor-fold> private pack.AdderWebService getAdderWebService() { pack.AdderWebService adderWebService = null; try { javax.naming.InitialContext ic = new javax.naming.InitialContext(); adderWebService = (pack.AdderWebService) ic.lookup("java:comp/env/service/AdderWebService"); } catch(javax.naming.NamingException ex) { ex.printStackTrace(); } return adderWebService; } private pack.AdderWebServiceSEI getAdderWebServiceSEIPort() { pack.AdderWebServiceSEI adderWebServiceSEIPort = null; try { Stub stub; adderWebServiceSEIPort = getAdderWebService().getAdderWebServiceSEIPort(); stub = (Stub)adderWebServiceSEIPort; stub._setProperty(javax.xml.rpc.Stub.SESSION_MAINTAIN_PROPERTY, true); adderWebServiceSEIPort= (pack.AdderWebServiceSEI)stub; } catch(javax.xml.rpc.ServiceException ex) { ex.printStackTrace(); } return adderWebServiceSEIPort; } }
and here is the code for the JSE endpoint:
package pack; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.xml.rpc.ServiceException; import javax.xml.rpc.handler.soap.SOAPMessageContext; import javax.xml.rpc.server.ServiceLifecycle; import javax.xml.rpc.server.ServletEndpointContext; /** * This is the implementation bean class for the AdderWebService web service. * Created May 22, 2006 8:30:25 PM * @author julien */ public class AdderWebServiceImpl implements AdderWebServiceSEI, ServiceLifecycle{ ServletEndpointContext endptCtx; SOAPMessageContext msgCtx; /** * Web service operation */ public int add(int number) throws java.rmi.RemoteException { System.out.println("add called"); HttpSession session = endptCtx.getHttpSession(); System.out.println("SESSION ID "+session.getId()); if(session !=null){ System.out.println("session not null"); String idFromClient = msgCtx.getProperty("id").toString(); System.out.println("----"+idFromClient); String id = (String)session.getAttribute("id"); System.out.println("----"+id); if (id!= null && idFromClient.equals(id)){ System.out.println("nested non null"); int total = (Integer)session.getAttribute("total") + number; session.setAttribute("total",total); return total; } else{ System.out.println("nested null"); session.setAttribute("id", idFromClient); int total = number; session.setAttribute("total",total); System.out.println("here"+session.getAttribute("id")); return total; } } else{ System.out.println("session null"); return 0; } } public void init(Object context) throws ServiceException { System.out.println("init called"); endptCtx = (ServletEndpointContext) context; msgCtx = (SOAPMessageContext)endptCtx.getMessageContext(); } public void destroy() { System.out.println("destroy called"); } }
Here is the output from the console:
1:53:47,692 INFO [AxisService] Web Service deployed: http://ordinateur:8080/WebApplicationFiveEndpoint/AdderWebService 01:53:48,720 INFO [STDOUT] session Created 01:53:57,708 INFO [STDOUT] init called 01:53:57,769 INFO [STDOUT] org.jboss.axis.message.SOAPHeaderElementAxisImpl@1aa34dc[[mi:message-id: null]] 01:53:57,769 INFO [STDOUT] 123456789 01:53:57,774 INFO [STDOUT] add called 01:53:57,774 INFO [STDOUT] session Created 01:53:57,775 INFO [STDOUT] SESSION ID B15EEC235A416BE62D36192EAEB8AA88 01:53:57,775 INFO [STDOUT] session not null 01:53:57,776 INFO [STDOUT] ----123456789 01:53:57,776 INFO [STDOUT] ----null 01:53:57,776 INFO [STDOUT] nested null 01:53:57,778 INFO [STDOUT] here123456789 01:53:57,792 INFO [STDOUT] destroy called 01:54:04,027 INFO [STDOUT] init called 01:54:04,042 INFO [STDOUT] org.jboss.axis.message.SOAPHeaderElementAxisImpl@19ab9c5[[mi:message-id: null]] 01:54:04,042 INFO [STDOUT] 123456789 01:54:04,043 INFO [STDOUT] add called 01:54:04,044 INFO [STDOUT] session Created 01:54:04,044 INFO [STDOUT] SESSION ID 1C0770F2DF80971FC59F54DE3CCBBCE0 01:54:04,044 INFO [STDOUT] session not null 01:54:04,044 INFO [STDOUT] ----123456789 01:54:04,045 INFO [STDOUT] ----null 01:54:04,045 INFO [STDOUT] nested null 01:54:04,045 INFO [STDOUT] here123456789 01:54:04,082 INFO [STDOUT] destroy called
As you can see, I have enabled session maintenance and still it does not work. FYI, I use Jboss 4.0.3. Can anyone help please??
Thanks in advance,
Julien.